我有一个requirements.txt
,它指的是一个托管在内部gitlab服务器上的软件包(例如,git+ssh://git@srv/pkgs/mypkg.git@v1#egg=mypkg
)。当我正在进行开发构建时,pip i -r requirements.txt
工作,因为gitlab服务器有我的凭据。当我在我的docker镜像中运行pip i -r requirements.txt
时,它会失败,因为git无法通过服务器进行身份验证。理想情况下,我不希望docker镜像存储任何ssh密钥。
我试图通过一个“预泊坞”制造目标来解决这个问题,该目标将运行pip download -r requirements.txt
。 Dockerfile将指示docker将所有包复制到容器中,然后使用pip i
执行--find-links=file:///app/pip-cache
(/app/pip-cache
是我将存储容器本地化包的地方)。这似乎不起作用;当它从远程git存储库获取时,看起来像pip不考虑--find-links
,所以当尝试使用远程服务器进行身份验证时它仍然失败,即使该包在/app/pip-cache
中。
我假设pip
不知道/app/pip-cache
中的包与我从gitlab服务器请求的包是一样的。 (?)
有没有办法暗示pip
内部的requirements.txt
这个git+ssh://
包也可以在当地找到?否则,是否有另一个更合适的解决方案来解决这个问题?
在Docker镜像中克隆私有git存储库的最常用方法是使用ssh密钥。您可以使用ssh密钥在存储库上启用ssh克隆。然后,在映像中复制此ssh密钥,并使用ssh克隆存储库。
这种方法的问题在于键将成为图像的一部分,如果您共享图像,任何人都可以从图像层中检索您的ssh键(即使您在完成时删除了键)。这个问题有多种解决方案。一种选择是使用--squash
选项进行docker build,将docker图层压缩成单个图层。这将从构建层中泄漏ssh密钥。
另一种更好的方法是使用Docker multi-stage builds。您基本上使用ssh或username / pass auth将代码拉入第一个图像。然后,将代码复制到基本映像中。这里的优点是克隆过程不是结果图像的一部分,因此分泌物不会随Docker镜像泄漏。