Php 生产中的Docker和package经理

Php 生产中的Docker和package经理,php,docker,composer-php,docker-compose,Php,Docker,Composer Php,Docker Compose,我正在开发一个PHP应用程序,我想让它使用docker容器运行。我使用的是包管理器,它可以提取所有依赖项。除了依赖项之外,所有代码都保存在git存储库中 为了在本地机器上运行一切,我使用docker compose(图)。我将应用程序代码(包括供应商文件夹)装载到容器上的卷中。这是我的docker-compose.yml文件 nginx: image: nginx:1.9 links: - php volumes: - conf/nginx

我正在开发一个PHP应用程序,我想让它使用docker容器运行。我使用的是包管理器,它可以提取所有依赖项。除了依赖项之外,所有代码都保存在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
    以拉入所有文件。如前所述,不可取

  • 我对docker还是个新手,所以可能是我把事情搞错了。我很想得到一个正确的答案

    您的
    Dockerfile
    应该构建容器映像,就像没有装入卷一样。克隆或复制容器中的代码,运行composer以安装依赖项。在没有任何卷的情况下运行容器应该是可行的

    生产环境中的卷主要用于持久化数据和日志。您的代码不应位于装入的卷中

    出于开发目的,您可以将卷装载到代码位置,并且您的容器仍然可以工作


    要加快构建过程,请先复制
    composer.json
    composer.lock
    文件,并将依赖项安装到源代码树之外的位置。它将确保只在json文件更改时更新依赖项,而不是在每次代码更改时更新依赖项,从而大大加快了过程。

    作为一个小提示,在生产中,
    composer.lock
    文件应始终与命令
    composer install
    一起使用,因为这将确保安装与上次提交锁文件时相同的依赖项:)