我应该在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 🙂
- 如何只允许访问postgresql中的kubernetes pod?
- 在Docker容器中用python模块连接到PostgreSQL
- Docker的PHP 7.1 imagick
- 在Windows Docker容器Windows Server 2016中运行时的Windows Defender /更新问题
- 尝试在composer php中运行php内置服务器时,获取“php_network_getaddresses:getaddrinfo失败:名称或服务未知”
- DataGrip连接失败,Postgres Docker
- docker工人连接问题
- 在docker容器中运行php -S命令(oneoff)
- Docker – 连接到数据库与续集亲