Docker:通过参数共享私钥

我想分享我的github私钥到我的docker集装箱。

我正在考虑通过ARGs通过docker-compose.yml分享它。

这是否可以使用ARG共享私钥? 将一个variables从docker-compose.yml文件传递给Dockerfile

# docker-compose.yml file version: '2' services: my_service: build: context: . dockerfile: ./docker/Dockerfile args: - PRIVATE_KEY=MULTI-LINE PLAIN TEXT RSA PRIVATE KEY 

然后我希望在我的Dockerfile使用它:

 ARG PRIVATE_KEY RUN echo $PRIVATE_KEY >> ~/.ssh/id_rsa RUN pip install git+ssh://git@github.com/... 

可以通过ARG吗?

如果您可以使用最新的docker 1.13(或17.03 ce),则可以使用docker swarm secret:请参阅“ pipe理Docker Swarm群集中的秘密 ”

这可以让你将一个秘密与你正在启动的容器相关联:

 docker service create --name test \ --secret my_secret \ --restart-condition none \ alpine cat /run/secrets/my_secret 

如果在你的情况下,docker群不是一个选项,你可以尝试设置一个docker工凭证助手 。
请参阅“ 摆脱Docker纯文本凭据 ”。 但是这可能不适用于一个私人的SSH密钥。


您可以使用Hashicorp Vault这样的独立秘密pipe理器,在“ 秘密和LIE能力:现代秘密pipe理现状(2017) ”中查看其他相关选项。

尽pipeARG本身不会在构build的映像中保留下来,但是当您在Dockerfile中的某处引用ARGvariables时,将会出现在历史logging中:

 FROM busybox ARG SECRET RUN set -uex; \ echo "$SECRET" > /root/.ssh/id_rsa; \ do_deploy_work; \ rm /root/.ssh/id_rsa 

正如VonC所指出的那样,现在有一个swarmfunction可以存储和pipe理机密,但是还不能解决构build时间问题。

构build

在Docker〜1.14(或任何等效的新版本名称)中应该是--build-secret标志 (也是#28079 ),它允许您在构build过程中挂载一个秘密文件。

与此同时,其中一个解决scheme是在某个地方运行networking服务,您可以使用客户端在构build过程中抽取秘密。 然后,如果构build将密码存放在文件中,例如~/.ssh/id_rsa ,那么必须在创build该文件的RUN步骤完成之前删除该文件。

我见过的最简单的解决scheme是用nc提供一个文件:

 docker network create build docker run --name=secret \ --net=build \ --detach \ -v ~/.ssh/id_rsa:/id_rsa \ busybox \ sh -c 'nc -lp 8000 < /id_rsa' docker build --network=build . 

然后收集秘密,存储它,使用它,并在Dockerfile RUN步骤中将其删除。

 FROM busybox RUN set -uex; \ nc secret 8000 > /id_rsa; \ cat /id_rsa; \ rm /id_rsa 

项目

有一些公用事业有相同的前提,但在不同层次的复杂性/function。 有些是像Hashicorps Vault这样的通用解决scheme。

  • Dockito Vault
  • Hashicorp Vault
  • 搬运工-SSH-EXEC