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

每次我运行docker-compose up时,我都会面对以下消息



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

Docker文件

#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;如果命令运行失败,则此状态码为非零。
结论:

当您启动composer容器时,它将执行该容器的默认命令,该默认命令由CMD中的Dockerfile配置,并回退到ENTRYPOINT,后者是composer可执行文件,不带任何参数。
您可以通过运行以下命令来验证此行为:

docker-compose logs composer
composer只是一个实用程序,因此不应在docker-compose.yml中定义为“服务”。您可以将其保留在此处,以便能够运行快速的一次性命令,例如:
docker-compose run composer install
...但是您必须忍受命令已退出的提示。
一般建议:docker-compose不是任务运行程序,也不是为一次性命令设计的。维护者拒绝了一些实现功能以支持此类功能的建议。
例子):
  • 实现一个选项,以跳过带有docker-compose up的某些容器的自动启动->参见此issue
  • 10-07 15:49