【问题标题】:How can I pass secret data to a container如何将秘密数据传递给容器
【发布时间】:2015-12-16 08:28:46
【问题描述】:

我的 Tomcat 容器需要得到良好保护的数据,即用于数据库访问的 密码 和用于单点登录其他系统的 证书和密钥

我已经看到一些建议使用 -e-env-file 将秘密数据传递给容器,但这可以通过 docker inspect 发现(-env-file 还在 docker inspect 中显示文件的所有属性)。

另一种方法是将数据容器链接与服务容器的秘密,但我不喜欢在我的注册表中拥有这个数据容器的概念(可供更广泛的人访问) .我知道我可以建立一个私有注册表,但是我需要不同的注册表来进行测试和生产,并且仍然可以访问生产注册表的每个人都可以访问秘密数据。

我正在考虑使用包含机密数据的目录设置我的服务器,并将机密数据装载到我的容器中。这可以很好地与具有不同秘密的测试和生产服务器一起使用。但它会创建容器对我的特定服务器的依赖关系。

所以我的问题是:您如何处理秘密数据,该问题的最佳解决方案是什么?

【问题讨论】:

标签: security docker docker-compose docker-registry


【解决方案1】:

2017 年 1 月更新

Docker 1.13 现在有命令 docker secret 和 docker swarm。
另见“Why is ARG in a DOCKERFILE not recommended for passing secrets?”。


原始答案(2015 年 9 月)

Adrian Mouathis previous answer 中提到的docker vault 的概念在issue 1030 中得到了积极讨论(在issues 13490 上继续讨论)。

现在因为超出 docker 的范围而被拒绝,但也包括:

我们为这个问题想出了一个简单的解决方案:一个 bash 脚本,一旦通过单个 RUN 命令执行,从本地 HTTP 服务器下载私钥,执行给定命令并删除密钥之后

由于我们在单个 RUN 中完成所有这些操作,因此图像中不会缓存任何内容。下面是它在 Dockerfile 中的样子:

RUN ONVAULT npm install --unsafe-perm

我们围绕这个概念的第一个实现可在dockito/vault 获得。

为了在本地开发图像,我们使用自定义开发框,将 Dockito Vault 作为服务运行。

唯一的缺点是需要运行 HTTP 服务器,因此无需构建 Docker 集线器。

【讨论】:

  • 赞成更新指向 docker 的秘密管理功能。
【解决方案2】:

将加密密钥安装到容器中,然后通过管道传递密码。困难来自detach 模式,它会在读取容器内的管道时挂起。这是一个解决方法:

cid=$(docker run -d -i alpine sh -c 'read A; echo "[$A]"; exec some-server')
docker exec -i $cid sh -c 'cat > /proc/1/fd/0' <<< _a_secret_

首先,使用-i 选项创建docker daemon,命令read A 将挂起等待来自/proc/1/fd/0 的输入; 然后运行第二个 docker 命令,从 stdin 读取 secret 并重定向到最后一个挂起的进程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-27
    • 2021-09-09
    • 1970-01-01
    • 2021-10-04
    • 1970-01-01
    • 1970-01-01
    • 2021-11-29
    相关资源
    最近更新 更多