PHP的容器';s composer软件包管理器显示消息/错误:";docker“U composer”U 1已退出,代码为“0”;与docker撰写

PHP的容器';s composer软件包管理器显示消息/错误:";docker“U composer”U 1已退出,代码为“0”;与docker撰写,docker,docker-compose,composer-php,yaml,dockerfile,Docker,Docker Compose,Composer Php,Yaml,Dockerfile,我正在尝试创建一个composer容器(Dockerfile),并在我的docker compose.yml中使用此容器,但看起来容器没有启动 每次运行docker compose up docker_编写器_1已退出,代码为0 这些是我的Dockerfile和docker compose.yml文件: Dockerfile #composer FROM composer EXPOSE 9090 docker-compose.yml version: '3' services: php-

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

每次运行
docker compose up

docker_编写器_1已退出,代码为0

这些是我的
Dockerfile
docker 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容器中。 我不认为这是一个优雅的解决方案


如何解决此问题?

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

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

结论: 使用状态代码
0
激发的容器的消息不是故障指示,而是每个
编写器[…]
命令的预期行为

当启动
composer
容器时,它会执行容器的默认命令,该命令由
Dockerfile
中的
CMD
配置,并返回到
入口点
,该入口点是
composer
可执行文件,没有任何参数

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

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

docker-compose run composer install 
。。。但您必须接受命令已退出的通知

一般忠告:
docker compose
不是任务运行程序,也不是为一次性命令设计的。维护人员拒绝了几项实施功能以支持此类功能的建议

示例:

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

端口80很有可能已经在本地计算机上使用。尝试更改它?容器正在运行什么命令?你能把它的
Dockerfile
添加到问题中吗?“已退出,代码为0”通常表示“已成功运行到完成”。@joshbeaurade不起作用。我刚刚tried@DavidMazedockerfile代码列在此代码块的第一行中。如果单独运行docker compose run composer,会发生什么情况?你期望发生什么?有道理。谢谢你详尽的回答!!您能告诉我如何在php docker容器中运行Composer吗?例如,我需要检查docker容器中composer的版本。我该怎么做?我问你这个问题是因为我需要安装laravel和其他一些软件包,在这个时候,当我尝试运行一个命令时,我得到:“composer not found”