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中的某处引用ARG
variables时,将会出现在历史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