我正在开发一个我希望使用docker容器运行的PHP应用程序。我正在使用composer包管理器,它可以引入所有依赖项。除了依赖项之外,所有代码都保存在git存储库中。
为了让我在本地机器上运行一切,我正在使用docker-compose(图)。我将应用程序代码(包括供应商文件夹)挂载到容器上的卷。这是我的docker-compose.yml文件。
nginx:
image: nginx:1.9
links:
- php
volumes:
- conf/nginx/default.conf:/etc/nginx/conf.d/default.conf
- src:/var/www/html
ports:
- "80:80"
php:
image: php:5.6.9-fpm
links:
- memcached
volumes:
- conf/php/php.ini /usr/local/etc/php/php.ini
- src:/var/www/html
volumes_from:
- nginx
我真正理解的是我如何将其推向生产环境或临时环境。根据我的理解,最好将所有内容都放在容器中,而不必运行包管理器,因为这可能会失败,或者包可能与本地计算机上的包不同。所以我提出了以下docker-compose.yml文件:
webapp:
image : quay.io/myusername/myrepo
php:
image: php:5.6.9-fpm
volumes:
- config/php/php.ini /usr/local/etc/php/php.ini
volumes_from:
- webapp
nginx:
image: nginx:1.9
links:
- php
volumes:
- config/nginx/default.conf:/etc/nginx/conf.d/default.conf
volumes_from:
- webapp
ports:
- "80:80"
webapp容器是从以下dockerfile构建的,并托管在某个存储库中。
FROM busybox
VOLUME /var/www/html
ADD src /var/www/html
我有一个git钩子会在quay.io上触发这个dockerfile的构建,并将我的源代码添加到图像中。
问题在于:供应商文件/依赖项不在版本控制中,因此不会添加它们。
我看到两种解决方案,我都觉得不理想。
composer install
以提取所有文件。如上所述,不是优选的。我对码头工作者来说还是一个新手,所以可能是我把事情弄错了。很想得到如何正确地做到这一点的答案。
答案 0 :(得分:2)
您的Dockerfile
应该构建容器图像,就好像没有安装卷一样。在容器中克隆或复制代码,运行composer来安装依赖项。运行没有任何卷的容器应该可行。
生产环境中的卷主要用于保存数据和日志。您的代码不应位于已装入的卷中。
出于开发目的,您可以将卷安装到代码位置,您的容器仍然可以正常工作。
要加快构建过程,请先复制composer.json
和composer.lock
文件,然后将依赖项安装到源树之外的位置。它将确保只有在json文件发生更改时才更新依赖项,而不是每次更改代码时都会更新,从而极大地加快了进程。