Docker:通过参数共享私钥

Docker:通过参数共享私钥,docker,docker-compose,dockerfile,ssh-keys,Docker,Docker Compose,Dockerfile,Ssh Keys,我想将我的github私钥共享到docker容器中 我正在考虑通过ARGs通过docker-compose.yml共享它 是否可以按此处所述使用ARG共享私钥? 然后我希望在我的Dockerfile中使用它: ARG PRIVATE_KEY RUN echo $PRIVATE_KEY >> ~/.ssh/id_rsa RUN pip install git+ssh://git@github.com/... 可以通过ARGs吗?如果可以使用最新的docker 1.13(或17.0

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

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

是否可以按此处所述使用ARG共享私钥?

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

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

可以通过ARGs吗?

如果可以使用最新的docker 1.13(或17.03 ce),则可以使用docker swarm机密:请参阅“”

允许您将机密关联到要启动的容器:

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

如果docker swarm不是您的选择,您可以尝试设置一个 见“”。但这可能不适用于私有ssh密钥



您可以使用独立的机密管理器检查“”中的其他相关选项,如。

尽管
ARG
本身不会保留在生成的映像中,但当您引用Dockerfile中某个位置的
ARG
变量时,该变量将出现在历史记录中:

FROM busybox
ARG SECRET
RUN set -uex; \
    echo "$SECRET" > /root/.ssh/id_rsa; \
    do_deploy_work; \
    rm /root/.ssh/id_rsa
因为现在有了swarm功能来存储和管理机密,但这并不能解决构建时的问题

建立 Docker~1.14(或任何等效的新发行版名称)应该是(也)允许您在构建期间装载机密文件的版本

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

我见过的最简单的解决方案是使用
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 .
项目 有许多实用程序都有相同的前提,但复杂程度/功能各不相同。有些是通用解决方案,如Hashicorps Vault


您希望将私钥存储在映像中还是希望对其保密?不建议在映像中使用私钥,因为它很容易推送到公共注册表。请考虑将其存储在外部,要么用一个秘密,一个由您的入口点处理的注入环境变量,要么作为一个卷。@ Matt,我正在寻找更安全的解决方案,但不确定哪一个更好。
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 .
FROM busybox
RUN set -uex; \
    nc secret 8000 > /id_rsa; \
    cat /id_rsa; \
    rm /id_rsa