docker 和 php:将依赖项(composer)放入容器中

Phi*_*ann 6 php composer-php docker docker-compose devops

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

因为我们都是优秀的开发人员,所以我们知道 - 现在没有使用 Composer 构建 php 应用程序的方法。

我的问题:

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

RUN cd /app && composer install --no-interaction --prefer-source --optimize-autoloader
Run Code Online (Sandbox Code Playgroud)

或者我应该在开发过程中安装依赖项并构建包含依赖项的容器映像?


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

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

顺便一提

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

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

提前致谢,菲利普

Phi*_*ann 5

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

开发环境:

将整个 src 添加为音量:

volumes:
  - .:/app
Run Code Online (Sandbox Code Playgroud)

初始作曲家安装命令

docker-compose exec app composer install
Run Code Online (Sandbox Code Playgroud)

安装新的作曲家包:

docker-compose exec app composer require some/package
Run Code Online (Sandbox Code Playgroud)

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

生产环境:

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

volumes:
  - public/uploads:/app/public/uploads
Run Code Online (Sandbox Code Playgroud)

将 /vendor 添加到 .dockerignore

并在构建期间运行 composer install

RUN cd /app && composer install --no-dev --no-interaction --optimize-autoloader
Run Code Online (Sandbox Code Playgroud)

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

这个解决方案还有两个缺点,也许有人给我输入了:

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

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

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

我不知道如何正确解决这个问题。也许我可以为开发容器创建一个具有 dev 用户名称的用户,并让这个用户运行命令和 php-fpm 等......我猜对于生产 root 来说没问题。

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

更新

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

RUN useradd -ms /bin/bash  newuser
USER newuser
Run Code Online (Sandbox Code Playgroud)

如果您也想创建家庭用户

WORKDIR /home/newuser
Run Code Online (Sandbox Code Playgroud)

或者

mkdir /home/newuser
Run Code Online (Sandbox Code Playgroud)

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

USER root
Run Code Online (Sandbox Code Playgroud)


Agg*_* .J -1

硬币的两面——

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

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

  • 这个问题是使用composer.lock文件解决的 (3认同)