访问在Dockerfile中构build所需的秘密/私人文件?

我试图在Docker中构build一个图像,需要一些秘密文件来做一些事情,比如从一个私人的git仓库中取出。 我见过很多这样的代码的人:

ADD id_rsa /root/.ssh/id_rsa RUN chmod 700 /root/.ssh/id_rsa RUN touch /root/.ssh/known_hosts RUN ssh-keyscan github.com >> /root/.ssh/known_hosts RUN git clone git@github.com:some/repo.git /usr/local/some_folder 

尽pipe这样做有效,但这意味着我必须将自己的id_rsa存储在我的图像中,这让我觉得不好。 我宁愿把秘密文件保存在s3这样的云存储中,只是传递凭据作为环境variables,以便能够把所有的东西都拉下来。

我知道我可以在docker run使用-e开关传递环境variables,但是如果我在构build时需要一些文件(如id_rsa来执行git clone),我该怎么办? 理想情况下,我可以将环境variables传递给docker build ,但这是不可能的(我不明白为什么)。

那么,想法? 在这里做什么规范/正确的事情? 我不能成为这个问题的第一人。

我将从最简单的部分开始,我认为这是一个常见的误解:

理想情况下,我可以将环境variables传递给Docker构build,但这是不可能的(我不明白为什么)。

docker构build意味着是可重复的。 给定相同的上下文(与Dockerfile相同的目录下的文件),结果图像是相同的。 他们也是很简单的。 两者一起解释了缺less环境选项或其他条件。

现在,因为构build需要重现 ,每个命令的执行都被caching 。 如果你运行构build两次,那么git pull将只会第一次运行。

通过你的评论,这不是你想要的:

所以任何新的图像构build,我们总是想要最新版本的回购

要触发一个新的构build,您需要更改上下文或Dockerfile

规范的方式(我可能滥用这个词,但是这是自动化构build如何工作)是将Dockerfile包含在git中。

这允许一个简单的git pull ; docker build ...工作stream程git pull ; docker build ... git pull ; docker build ...并避免存储您的git凭据的问题。