我应该在Docker构build中运行Composer安装

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

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

但我有我的composer.json中的私人回购,这需要我复制在dockerbuild设正常工作的SSH密钥。 我感到不舒服,在我的PHP应用程序泊坞窗图像中包装我的ssh密钥。

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

还有其他方法来处理这个问题吗?

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

1.)如何在Docker中处理瞬态文件

Docker非常擅长封装环境的全部和全部的娱乐。 如果你在容器的“外部”处理部分stream程,也就是说你在docker build过程之外运行composer install ,那么你的可移植构build过程就不那么容易了,因为你可能已经引入了你不知道的机器/环境依赖。

如果你总是在Docker中重build完整的环境,那么你可以保证你的依赖总是满足的,你可以把dockerfile给任何其他人,他们也会很有信心地在本地重build而没有问题。

瞬态文件是在Docker中构build的理想select! 所以我会尽可能在容器内构build它们。

2.)如何从Docker构build过程中取消授权

这导致我们到第二个问题,如何从构build中分离授权?

选项1 – 烘焙在composer phpauth.json与专用构build用户的信誉:

正如其他答案所说,你可以'烤'的凭据,然后再删除它们。 但是,你不会想'烤'像你的SSH密钥一样敏感。 Composer支持一个auth.json文件,为什么不创build一个专用的构build用户,并将其声明(而不是你的)存储在auth.json文件中? 如果它已经妥协,你可以更改密码。 一旦composer php安装完成删除或覆盖文件。

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

选项2 – 使信誉自己暂时,并使用docker exec将它们传递到Docker容器:

我还没有完全testing这种方法,但我不明白为什么这样的东西不会工作。

1.)你build立一个基本的PHP容器,它能运行'composer install'(或者使用docker集线器)

2.)你旋转这个基础容器,以便它正在运行

3.)您使用docker exec将您的信用传递给已经烘焙到您的容器中的包装脚本。 包装脚本将使用HTTP基本authentication运行composer php安装 – 它将已经有用户名烘焙,所以你只需要提供密码按照http基本技术

 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构build之外进行作曲者安装是有意义的。

您通常会有一个初始构build过程来构build您的应用程序代码。 这个版本可能会运行一些testing或自动化testing,然后生成一个包含运行应用程序所需的所有代码的工件。 这将包括您的源代码,加上您的供应商文件夹和任何自动生成的代码(ORM类,caching等)。 这些工件通常是tar文件。

然后,您将在随后的Docker版本中将该代码工件复制到您的Docker容器中。

你总是可以做一个构build,这将复制〜/ .ssh,运行composer php安装,然后rm键…之后,如果将需要使用SSH以后 – 在docker-compose(或通常由-v)你只需在运行时使用volume / -v在本地挂载.ssh 🙂