[英]How to use composer with docker-compose?
我正在配置docker-compose.yml
文件,并且我想运行一个包含 Elastic、Redis、Symfony 和 composer 的 PHP 堆栈。
现在我遇到的问题是,我不知道如何将composer与docker一起使用,因为composer的某些功能需要PHP和一些扩展。 我不想构建一个新图像并在其上安装 Nginx 和 PHP 以及 PHP 的 Composer 和扩展,我不会将它们全部放在一个不同的图像中。
到目前为止,我尝试过的是:
version : '2'
services:
nginx:
image: tutum/nginx
ports:
- "80:80"
volumes:
- ./nginx/default:/etc/nginx/sites-available/default
- ./nginx/default:/etc/nginx/sites-enabled/default
- ./logs/nginx-error.log:/var/log/nginx/error.log
- ./logs/nginx-access.log:/var/log/nginx/access.log
- ./app:/usr/share/nginx/html
phpfpm:
image: php:fpm
ports:
- 9000:9000
volumes:
- ./app:/usr/share/nginx/html
composer:
image: composer/composer:php7
command: install
volumes:
- ./app:/app
elastic2.4.4:
image: elasticsearch:2.4.4
ports:
- 9200:9200
volumes:
- ./esdata1:/usr/share/elasticsearch/data
redis:
image: redis:3.2
ports:
- 6379:6379
但这不会安装依赖项。
我设置了我docker-compose.yml
文件,因此一个 docker 实例将使用composer/composer
映像并在共享容器中执行composer install
。 然后,所有其他图像都可以访问作曲家创建的供应商目录。 棘手的部分是意识到composer/composer
图像假定composer.json
文件将位于/app
目录中。 我不得不通过将我的共享容器指定为working_dir
来覆盖此行为:
version: '3'
services:
#=====================#
# nginx proxy service #
#=====================#
nginx_proxy:
image: nginx:alpine
networks:
- test_network
ports:
- "80:80"
- "443:443"
volumes:
# self-signed testing wildcard ssl certificate
- "./certs:/certs"
# proxy needs access to static files
- "./site1/public:/site1/public"
- "./site2/public:/site2/public"
# proxy needs nginx configuration files
- "./site1/site1.test.conf:/etc/nginx/conf.d/site1.test.conf"
- "./site2/site2.test.conf:/etc/nginx/conf.d/site2.test.conf"
container_name: nginx_proxy
#===============#
# composer.test #
#===============#
composer.test:
image: composer/composer
networks:
- test_network
ports:
- "9001:9000"
volumes:
- "./composer:/composer"
container_name: composer.test
working_dir: /composer
command: install
#============#
# site1.test #
#============#
site1.test:
build: ./site1
networks:
- test_network
ports:
- "9002:9000"
environment:
- "VIRTUAL_HOST=site1.test"
volumes:
- "./composer:/composer"
- "./site1:/site1"
container_name: site1.test
#============#
# site2.test #
#============#
site2.test:
build: ./site2
networks:
- test_network
ports:
- "9003:9000"
environment:
- "VIRTUAL_HOST=site2.test"
volumes:
- "./composer:/composer"
- "./site2:/site2"
container_name: site2.test
# networks
networks:
test_network:
这是目录结构的外观:
certs
test.crt
test.key
composer
composer.json
site1
app
public
Dockerfile
site1.test.conf
site2
app
public
Dockerfile
site2.test.conf
docker-compose.yml
如果您查看composer/composer:php7
Dockerfile
,您会看到它基于php:7.0-alpine
并且似乎不包含fpm
。 因此,您可以使用composer/composer:php7
作为基础镜像在其上安装php-fpm
。
因此,由于您在所有三个容器中进行项目映射,因此在一个容器中运行composer install
应该会导致更改在所有三个容器中都可见。
就我个人而言,我认为将 PHP 和 nginx 分离到 2 个不同的容器中没有任何意义,因为一个容器高度依赖另一个容器。 将您的应用程序映射到两个容器中也是无稽之谈的完美示例。 这就是为什么我维护自己的 nginx+php Docker 映像的公共构建。 你可以在这里查看。 有更多口味的更多版本。 它们都带有作曲家。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.