访问Dockerfile中构建所需的秘密/私有文件?

时间:2014-09-06 07:10:27

标签: security build docker

我正在尝试在Docker中构建一个图像,它需要一些秘密文件来执行诸如从私有git repo中提取的内容。我见过很多代码都是这样的人:

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

虽然这样可行,但这意味着我必须将我的私人id_rsa存储在我的图像中,这让我觉得不错。我宁愿做的是将我的秘密文件保存在某些云存储中,例如s3,只需将凭据作为环境变量传递,以便能够将其他所有内容都删除。

我知道我可以使用docker run开关在-e传递环境变量,但是如果我在构建时需要一些文件(比如id_rsa来执行git克隆),我能做什么?做?理想情况下,我可以将环境变量传递给docker build,但这是不可能的(我无法理解为什么)。

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

1 个答案:

答案 0 :(得分:2)

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

  

理想情况下,我可以将环境变量传递给docker build,但这是不可能的(我无法理解为什么)。

Docker构建意味着可重现。给定相同的上下文(与Dockerfile在同一目录下的文件),结果图像是相同的。它们也很简单。这两件事共同解释了缺乏环境选择或其他条件。

现在,因为构建需要可重现,所以每个命令的执行都是缓存。如果您运行构建两次,git pull将仅在第一次运行。

根据你的评论,这不是你想要的:

  

所以在任何新的图像构建上,我们总是想要最新版本的repo

要触发新版本,您需要更改上下文或Dockerfile

规范方式(我可能会滥用这个词,但这就是automated builds工作的方式)将Dockerfile包含在git中。

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