繁体   English   中英

我应该在我的docker build中运行composer install

[英]should I run composer install inside my docker build

我可能有一个看起来像这样的docker文件:

COPY . ./
RUN composer install --no-dev --no-interaction -o

但我在我的composer.json中有私有存储库,这要求我复制ssh键以使docker构建正常工作。 我觉得在我的php应用程序docker镜像中包装我的ssh键感到很不舒服。

或者,我可以在docker build之外运行composer install(例如在build.sh bash脚本中),并在填充vendor /之后复制目录。 这是正确的方法吗?

还有其他方法可以解决这个问题吗?

这是一个非常好的问题,它描述了我现在面对过几次的原则,实际上是两个独立但相关的问题:

1.)如何最好地处理Docker中的瞬态文件

Docker非常擅长封装环境的全部和完全重新创建。 如果您在容器“外部”处理部分进程,即在docker build过程之外运行composer install ,那么您的可移植构建过程就会减少,因为您可能已经引入了您不了解的机器/环境依赖性。

如果你总是在Docker中重建完整的环境,那么你可以保证你的依赖关系总是得到满足,并且你可以将dockerfile提供给其他任何人,并且他们也很有信心能够在没有问题的情况下在本地重建。

瞬态文件非常适合在Docker中构建! 所以我会尝试尽可能在容器内构建它们。

2.)如何从Docker构建过程中解除授权

这引出了我们的第二个问题,如何从构建中解除授权?

选项1 - 在作曲家auth.json中烘焙,其中包含专用构建用户的信用卡:

正如其他答案所说,您可以“烘焙”凭据,然后再次删除它们。 但是你不想像你的ssh键一样“烘烤”敏感的东西。 Composer支持auth.json文件,那么为什么不创建一个专用的构建用户并在auth.json文件中存储其cred(而不是你的)? 如果它受到损害,您可以更改密码。 编辑器安装完成后删除或覆盖文件。

COPY . ./
RUN composer install --no-dev --no-interaction -o
RUN rm -f ./auth.json

选项2 - 使信用卡本身成为瞬态并使用docker exec将它们传递到Docker容器中:

我还没有完全测试过这种方法,但我不明白为什么这样的东西不起作用。

1.)你构建了一个基本的PHP容器,它能够运行'composer install'(或者使用docker hub中的一个)

2.)你旋转这个基础容器,使其运行

3.)您使用docker exec将您的信用卡传递给已经烘焙到容器中的包装脚本。 包装器脚本将使用HTTP基本身份验证运行composer install - 它已经具有用户名,因此您只需要根据http-basic技术提供密码

docker exec -d my_base_php_container php -f /my_wrapper_script.php ${PASSWORD}

4.)您将此容器提交为新图像

docker commit --change "composer install" ${CONTAINER_ID} my_installed_image:1.0

滑稽。 发布此问题仅几天后,Docker 17.05就发布了,并为此提供了一个解决方案: 多阶段构建 只需将您的作曲家内容放入dockerfile并构建您的应用程序即可。 然后,开始第二阶段并将您的应用程序复制为第一阶段的构建工件。

我认为在你描述的情况下,在docker build之外进行composer安装是有意义的。

您通常会有一个初始构建过程来构建您的应用程序代码。 此构建可能会运行一些linting或自动测试,然后生成包含运行应用程序所需的所有代码的工件。 这将包括您的源代码,以及您的供应商文件夹和任何自动生成的代码(ORM类,缓存等)。 这些工件通常是tar文件。

然后,您可以将该代码工件复制到后续docker构建中的docker容器中。

您可以随时进行构建,即COPY~ / .ssh,运行composer install然后运行rm键......之后,如果以后需要使用ssh - 在docker-compose中(或通常由-v)你只需在运行期间使用volume / -v在本地挂载.ssh :)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM