Docker:通过参数共享私钥

时间:2017-03-14 22:55:02

标签: docker docker-compose dockerfile ssh-keys

我想将我的github私钥分享到我的docker容器中。

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

是否可以使用ARG共享私钥,如此处所述? Pass a variable to a Dockerfile from a docker-compose.yml file

# 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?

2 个答案:

答案 0 :(得分:2)

如果您可以使用最新的docker 1.13(或17.03 ce),则可以使用docker swarm secret:请参阅“Managing Secrets In Docker Swarm Clusters

这允许您将秘密与要启动的容器相关联:

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

如果您的情况下不支持docker swarm,您可以尝试设置docker credential helper 请参阅“Getting rid of Docker plain text credentials”。但这可能不适用于私人ssh密钥。

您可以使用Secrets and LIE-abilities: The State of Modern Secret Management (2017)之类的独立秘密管理器检查“Hashicorp Vault”中的其他相关选项。

答案 1 :(得分:1)

虽然ARG本身不会在构建的映像中保留,但是当您在Dockerfile中的某处引用ARG变量时,它将在历史记录中:

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

作为VonC notes,现在有一个用于存储和管理机密的群体功能,但尚未解决构建时间问题。

构建

进入Docker~1.14(或任何等效的新版本名称)应该是--build-secret flag(也是#28079),它允许您在构建期间安装机密文件。

与此同时,其中一个解决方案是在某个地方运行网络服务,您可以使用客户端在构建期间从中提取秘密。然后,如果构建将秘密放在文件中,例如~/.ssh/id_rsa,则必须在创建文件的RUN步骤完成之前删除该文件。

我见过的最简单的解决方案是使用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

项目

有许多实用程序具有相同的前提,但具有不同级别的复杂性/功能。有些是Hashicorps Vault等通用解决方案。