php - 生产环境中的 Docker 和包管理器

标签 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 钩子(Hook),它将触发在 quay.io 上构建此 dockerfile 并将我的源代码添加到图像中。

这是问题所在:供应商文件/依赖项不在版本控制中,因此不会被添加。

我看到了两种我都觉得不理想的解决方案。
  • 将依赖项添加到版本控制。
  • 运行命令composer install拉入所有文件。如上所述不是优选的。

  • 我对 docker 还是很陌生,所以可能是我搞错了。很想得到一个答案如何正确地做到这一点。

    最佳答案

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

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

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

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

    关于php - 生产环境中的 Docker 和包管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30644087/

    相关文章:

    Gradle 构建在 jenkins :alpine container: UnsatisfiedLinkError: linux-amd64/libnative-platform. so : libstdc++. so.6 中失败:

    php - 从多表查询中删除

    php - 如何在显示/显示 div 时包含特定的 php 文件 :"block"

    php - 无法将可调用结果分配给数组

    php - 使用 AJAX 数据更新数据库

    docker - 在 docker 中运行的实时调试节点应用程序

    docker - 通过 docker-compose 文件版本 "3"安装主机目录并重新使用数据卷

    php - 如何将 composer 包包含到纯 php 中?

    php - 更快的 Composer 安装

    php - Composer 插件自动加载依赖项