我正在开发一个我想使用 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 钩子(Hook),它将触发在 quay.io 上构建此 dockerfile 并将我的源代码添加到图像中。
这是问题所在:供应商文件/依赖项不在版本控制中,因此不会被添加。
我看到了两种我都觉得不理想的解决方案。
composer install
拉入所有文件。如上所述不是优选的。 我对 docker 还是很陌生,所以可能是我搞错了。很想得到一个答案如何正确地做到这一点。
最佳答案
您的 Dockerfile
应该构建容器镜像,就好像没有安装卷一样。克隆或复制容器中的代码,运行 composer 安装依赖项。运行没有任何卷的容器应该可以工作。
生产环境中的卷主要用于持久化数据和日志。您的代码不应位于已安装的卷中。
出于开发目的,您可以将卷安装到代码位置,您的容器仍然可以工作。
要加快构建过程,请复制您的 composer.json
和 composer.lock
首先文件并将依赖项安装到源代码树之外的位置。它将确保依赖项仅在您的 json 文件更改时才更新,而不是在每次代码更改时更新,从而极大地加快了进程。
关于php - 生产环境中的 Docker 和包管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30644087/