我正在尝试创建一个composer
容器(Dockerfile
),并在我的docker-compose.yml
中使用此容器,但看来该容器未启动。
每次我运行docker-compose up
时,我都会面对以下消息
这些是我的Dockerfile
和docker-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