我想将我的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?
答案 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等通用解决方案。