如何创建指向git仓库的requirements.txt,但如果它存在则使用本地版本的包?

时间:2018-01-30 16:40:56

标签: git docker pip

我有一个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包也可以在本地找到?否则,是否有另一个更合适的解决方案来解决这个问题?

1 个答案:

答案 0 :(得分:0)

在Docker镜像中克隆私有git存储库的最常用方法是使用ssh密钥。您可以使用ssh密钥在存储库上启用ssh克隆。然后,您可以在图像中复制此ssh密钥,然后 使用ssh克隆存储库。

这种方法的问题在于键将成为图像的一部分,如果您共享图像,任何人都可以从图像层中检索您的ssh键(即使您在完成时删除了键)。 这个问题有多种解决方案。一种选择是使用--squash选项进行docker build,将docker图层压缩成单个图层。这将从构建层中泄漏ssh密钥。

另一种更好的方法是使用Docker multi-stage builds。您基本上使用ssh或username / pass auth将代码拉入第一个图像。然后,将代码复制到基本映像中。这里的优点是 克隆过程不是结果图像的一部分,因此Docker镜像不会泄漏分泌物。