生产中的Docker和包管理器

时间:2015-06-04 12:38:24

标签: php docker composer-php docker-compose

我正在开发一个我希望使用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的构建,并将我的源代码添加到图像中。

问题在于:供应商文件/依赖项不在版本控制中,因此不会添加它们。

我看到两种解决方案,我都觉得不理想。

  1. 将依赖项添加到版本控制。
  2. 运行命令composer install以提取所有文件。如上所述,不是优选的。
  3. 我对码头工作者来说还是一个新手,所以可能是我把事情弄错了。很想得到如何正确地做到这一点的答案。

1 个答案:

答案 0 :(得分:2)

您的Dockerfile应该构建容器图像,就好像没有安装卷一样。在容器中克隆或复制代码,运行composer来安装依赖项。运行没有任何卷的容器应该可行。

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

出于开发目的,您可以将卷安装到代码位置,您的容器仍然可以正常工作。

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