我可能有一个看起来像这样的docker文件:
COPY . ./
RUN composer install --no-dev --no-interaction -o
但是我的composer.json中有私有存储库,这要求我复制ssh键以使docker构建正常工作。我觉得在我的php应用程序泊坞窗映像中包装我的ssh密钥感到很不舒服。
或者,我可以在docker build之外运行composer install(例如在build.sh bash脚本中),并在填充vendor /之后复制目录。这是正确的做法吗?
还有其他方法可以解决这个问题吗?
答案 0 :(得分:7)
这是一个非常好的问题,它描述了我现在面对过几次的原则,实际上是两个独立但相关的问题:
1.。)如何最好地处理Docker中的瞬态文件
Docker非常擅长封装环境的全部和完全重新创建。如果你在容器的“外部”处理部分进程,即你在composer install
进程之外运行docker build
,那么你的可移植性较低,因为你可能已经引入了机器/环境依赖性而你不是意识到了。
如果你总是在Docker中重建完整的环境,那么你保证你的依赖关系总是得到满足,并且你可以将dockerfile提供给其他人,他们也很有信心能够在没有问题的情况下在本地重建。 / p>
瞬态文件非常适合在Docker中构建!所以我会尝试尽可能在容器内构建它们。
2.如何从Docker构建过程中解除授权
这引导我们进入第二个问题,如何从构建中解除授权?
选项1 - 使用针对专用构建用户的信用卡在作曲家auth.json中进行烘焙:
正如其他答案所说,您可以“烘焙”凭据,然后再将其删除。但是你不想像你的ssh键一样“烘烤”敏感的东西。 Composer支持auth.json文件,那么为什么不创建一个专用的构建用户并在auth.json文件中存储其信用(而不是你的)?如果它受到损害,您可以更改密码。编辑器安装完成后删除或覆盖文件。
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将您的信用卡传递给已经烘焙到容器中的包装脚本。包装器脚本将运行composer install 使用HTTP基本身份验证 - 它已经有用户名,因此您只需根据http-basic technique提供密码
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
答案 1 :(得分:2)
我认为在你描述的情况下,在docker build之外进行作曲家安装是有意义的。
您通常会有一个初始构建过程来构建您的应用程序代码。此构建可能会运行一些linting或自动测试,然后生成包含运行应用程序所需的所有代码的工件。这将包括您的源代码,以及您的供应商文件夹和任何自动生成的代码(ORM类,缓存等)。这些工件通常是tar文件。
然后,您可以将该代码工件复制到后续docker构建中的docker容器中。
答案 2 :(得分:2)
好笑。发布此问题仅几天后,Docker 17.05就发布了,并为此提供了一个解决方案:multistage builds。只需将您的作曲家的东西放在dockerfile中并构建您的应用即可。然后,开始第二阶段,并将您的应用程序复制为第一阶段的构建工件。
答案 3 :(得分:0)
你总是可以进行构建,它将COPY~ / .ssh,运行composer install然后运行rm键...之后,如果以后需要使用ssh - 在docker-compose中(或通常由-v)你将在运行期间使用volume / -v在本地挂载.ssh。)