我如何创建一个指向git repo的requirements.txt,但如果它存在,则使用该软件包的本地版本?

问题描述 投票:1回答:1

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

git docker pip
1个回答
0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.