【问题标题】:container for PHP's composer package-manager shows message / error: "docker_composer_1 exited with code 0" with docker-composePHP 的 composer 包管理器的容器显示消息/错误:“docker_composer_1 exited with code 0”与 docker-compose
【发布时间】:2019-12-28 21:26:06
【问题描述】:

我正在尝试创建一个 composer 容器 (Dockerfile) 并在我的 docker-compose.yml 中使用这个容器,但看起来容器没有启动。

我每次运行docker-compose up时都会遇到以下消息

docker_composer_1 以代码 0 退出

这些是我的 Dockerfiledocker-compose.yml 文件:

Dockerfile

#composer
FROM composer
EXPOSE 9090

docker-compose.yml

version: '3'

services:
  php-fpm:
    build:
      context: ./php-fpm
    volumes:
      - ../src:/var/www

  nginx:
    build:
      context: ./nginx
    ports:
      - "80:80"
    volumes:
      - ../src/html:/var/www/html
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
      - ./nginx/sites/:/etc/nginx/sites-available
      - ./nginx/conf.d/:/etc/nginx/conf.d
    depends_on:
      - php-fpm

  database:
    build:
      context: ./database
    ports:
      - "3306:3306"
    environment:
      - MYSQL_DATABASE=mydb
      - MYSQL_USER=myuser
      - MYSQL_PASSWORD=secret
      - MYSQL_ROOT_PASSWORD=docker
    volumes:
      - ./database/data.sql:/docker-entrypoint-initdb.d/data.sql

  phpmyadmin:
    build:
      context: ./phpmyadmin
    environment:
      - PMA_HOST=database
      - PMA_PORT=3306
      - MYSQL_ROOT_PASSWORD=docker
    ports:
      - "8080:80"
    depends_on:
      - database

  composer:
    build:
      context: ./composer
    volumes:
      - ../src/html:/var/www/html
    ports:
      - "9090:80"

我不想将 Composer 安装到 php 容器中。 我不认为这是一个优雅的解决方案。

我该如何解决这个问题?

【问题讨论】:

  • 我们本地的 80 端口很有可能已经被使用。尝试改变它?
  • 容器正在运行什么命令?您可以将其Dockerfile 添加到问题中吗? “Exited with code 0”一般表示“运行成功”。
  • @JoshBeauregard 不起作用。我刚试过
  • @DavidMaze dockerfile 代码列在此代码块的第一行。
  • 如果你 docker-compose run composer 孤立,会发生什么?你预计会发生什么?

标签: docker docker-compose composer-php yaml dockerfile


【解决方案1】:

composer 是一个包管理器,并且 - 与“服务”相反 - 不是作为一个永无止境的进程运行。

composer 命令旨在运行一次,执行任务并在完成任务后以状态码结束(即安装或更新软件包,显示软件包信息,...)。如果命令运行成功,则此状态码为 0,如果失败则为非零。

结论:

容器以状态码0 激发的消息不是失败的指示,而是每个composer [..] 命令的预期行为。

当您的composer 容器启动时,它会执行由CMDDockerfile 中配置的容器的默认命令,并回退到ENTRYPOINT,这是不带任何参数的composer 可执行文件.

您可以通过运行来验证此行为:

docker-compose logs composer 

composer 只是一个实用程序,因此不应在您的docker-compose.yml 中定义为“服务”。您可以将其保留在那里,以便能够运行快速的一次性命令,例如:

docker-compose run composer install 

...但是您必须接受命令已退出的通知。

一般建议:

docker-compose 不是任务运行器,也不是为一次性命令而设计的。一些实现特性以支持此类功能的提议已被维护者拒绝。

示例:

  • 使用docker-compose up 实现一个选项以跳过某些容器的自动启动-> 参见issue

【讨论】:

  • 有道理。谢谢你详尽的回答!!你能告诉我如何在 php docker 容器中运行 Composer 吗?我的意思是,我需要检查例如 docker 容器中作曲家的版本。我怎样才能做到这一点?我问你这个是因为我需要安装 laravel 和其他一些软件包,此时当我尝试运行命令时,我得到:“composer not found”
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 2015-10-03
  • 1970-01-01
  • 2019-03-18
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 2018-04-04
相关资源
最近更新 更多