【问题标题】:docker and php: getting dependencies (composer) into the containerdocker和php:将依赖项(composer)放入容器中
【发布时间】:2018-05-12 21:19:33
【问题描述】:

一点背景:我是 docker 新手,还不知道任何最佳实践。我的任务是创建一个基于 php 的 web 服务,我决定使用 docker-compose 进行配置。

因为我们都是花哨的开发人员,所以我们知道 - 现在不使用 Composer 就无法构建 php 应用程序。

我的问题:

我应该在构建中安装依赖项吗?因此,通过将其添加到我的 Dockerfile 中:

RUN cd /app && composer install --no-interaction --prefer-source --optimize-autoloader

或者我应该在开发期间安装依赖项并使用包含的依赖项构建容器映像?


我只知道不这样做的一种方法:在开发机器上本地安装依赖项,然后构建容器。但是“最佳实践”会是什么样子呢?

而且 - 因为我是这个领域的新手 - 我将如何为我的应用服务容器运行“composer require some/package”?

顺便说一句

我还注意到一条消息“不要以 root/超级用户身份运行 Composer!”在构建容器时。我将COMPOSER_ALLOW_SUPERUSER=1 添加到我的Env 文件中(如here 所示),但此消息仍然出现。

是否可以在 docker 容器中不以 root 身份执行 composer install ?我可以忽略该消息吗?

提前致谢, 菲利普

【问题讨论】:

    标签: php docker composer-php docker-compose devops


    【解决方案1】:

    目前我正在努力实现以下解决方案:

    开发环境:

    将整个 src 添加为卷:

    volumes:
      - .:/app
    

    初始作曲家安装命令

    docker-compose exec app composer install
    

    安装新的作曲家包:

    docker-compose exec app composer require some/package
    

    该包将通过容器安装在您的composer包目录中(当然默认为/vendor),可以在您的ide中查看源代码等。

    生产环境:

    仅定义为音量的应用状态,例如:

    volumes:
      - public/uploads:/app/public/uploads
    

    将 /vendor 添加到 .dockerignore

    并在构建期间运行 composer install

    RUN cd /app && composer install --no-dev --no-interaction --optimize-autoloader
    

    因此,您将拥有要部署的预构建映像,但仍能够以更敏捷的方式进行开发。

    这个解决方案还有两个缺点,也许有人给我意见:

    1) 构建变得有点慢 - 似乎作曲家缓存无法正常工作

    一个解决方案(我不知道这在作曲家中是否可行)可能是作曲家缓存目录的卷。

    2) docker 创建的所有包都归 root 所有,因此您只能使用 sudo/root 会话处理这些文件/文件夹。

    我不知道如何正确解决此问题。也许我可以为开发容器创建一个名为 dev 用户的用户,并让该用户运行命令和 php-fpm 等……我想生产 root 可以。

    我对 docker 还是很陌生,并且愿意寻求更好的解决方案,所以我不会接受这个答案。

    更新

    Dockerfile 的docker 用户中添加新用户。如下

    RUN useradd -ms /bin/bash  newuser
    USER newuser
    

    如果你也想创建家庭用户

    WORKDIR /home/newuser
    

    mkdir /home/newuser
    

    如果你想回到root用户,你可以这样做

    USER root
    

    【讨论】:

    • 另一个缺点 - composer 不会检查您的 PHP 安装是否具有所有必需的依赖项,因为 PHP 将位于另一个容器中。
    【解决方案2】:

    硬币的两面 -

    在构建图像期间做一个很好的做法,我也和你一样。

    我们将从公共存储库获得最新更新,但硬币的另一面是我们无法确保它们与我们开发的版本相同。 您需要通过在 composer.json 中指定确切的版本来处理这个问题(不要使用 ^、*)。

    【讨论】:

    • 使用 composer.lock 文件处理该问题
    猜你喜欢
    • 2016-03-16
    • 2016-02-28
    • 1970-01-01
    • 2014-09-15
    • 2020-06-24
    • 2021-10-10
    • 2017-04-18
    • 1970-01-01
    • 2019-11-16
    相关资源
    最近更新 更多