我有一个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密钥。
我正在尝试通过使用“pre-docker”make target来解决这个问题,该目标将运行pip download -r requirements.txt
。 Dockerfile将指示docker将所有包复制到容器中,然后使用pip i
进行--find-links=file:///app/pip-cache
(/app/pip-cache
是我将存储容器本地化包的地方)。这似乎不起作用;看起来pip在从远程git存储库获取时不会占用--find-links
,所以当尝试使用远程服务器进行身份验证时它仍然会失败,即使该包在{{1 }}
我认为/app/pip-cache
不知道pip
中的包与我从gitlab服务器请求的包是一样的。 (?)
有没有办法在/app/pip-cache
pip
内提示这个requirements.txt
包也可以在本地找到?否则,是否有另一个更合适的解决方案来解决这个问题?
答案 0 :(得分:0)
在Docker镜像中克隆私有git存储库的最常用方法是使用ssh密钥。您可以使用ssh密钥在存储库上启用ssh克隆。然后,您可以在图像中复制此ssh密钥,然后 使用ssh克隆存储库。
这种方法的问题在于键将成为图像的一部分,如果您共享图像,任何人都可以从图像层中检索您的ssh键(即使您在完成时删除了键)。
这个问题有多种解决方案。一种选择是使用--squash
选项进行docker build,将docker图层压缩成单个图层。这将从构建层中泄漏ssh密钥。
另一种更好的方法是使用Docker multi-stage builds。您基本上使用ssh或username / pass auth将代码拉入第一个图像。然后,将代码复制到基本映像中。这里的优点是 克隆过程不是结果图像的一部分,因此Docker镜像不会泄漏分泌物。