您如何使用 docker-compose v3.1 管理秘密值?

新手上路,请多包涵

docker-compose.yml 规范 3.1 版引入了对 secrets 的支持。

我试过这个:

 version: '3.1'

services:
  a:
    image: tutum/hello-world
  secret:
    password: the_password
  b:
    image: tutum/hello-world

$ docker-compose up 返回:

Unsupported config option for services.secret: 'password'

我们如何在实践中使用秘密功能?

原文由 Eric 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.5k
2 个回答

您可以 从官方文档中阅读相应的部分

要使用机密,您需要在 docker-compose.yml 文件中添加两件事。首先,定义所有机密的顶级 secrets: 块。然后,在每个服务下的另一个 secrets: 块指定服务应该接收 哪些 秘密。

例如,创建 Docker 可以理解的两种机密: 外部 机密和 文件 机密。

1.使用 docker secret create 创建一个“外部”秘密

第一件事:要在 Docker 中使用机密,您所在的节点必须是 swarm 的一部分。

 $ docker swarm init

接下来,创建一个“外部”机密:

 $ echo "This is an external secret" | docker secret create my_external_secret -

(确保包括最后的破折号, - 。很容易错过。)

2. 将另一个秘密写入文件

$ echo "This is a file secret." > my_file_secret.txt

3. 创建一个 docker-compose.yml 文件同时使用这两个秘密

现在已经创建了两种类型的秘密,这里是 docker-compose.yml 文件,它将读取这两种类型并将它们写入 web 服务:

 version: '3.1'

services:
  web:
    image: nginxdemos/hello
    secrets:                    # secrets block only for 'web' service
     - my_external_secret
     - my_file_secret

secrets:                        # top level secrets block
  my_external_secret:
    external: true
  my_file_secret:
    file: my_file_secret.txt

Docker 可以从它自己的数据库(例如用 docker secret create 制作的秘密)或文件中读取秘密。上面显示了这两个示例。

4. 部署您的测试堆栈

使用以下命令部署堆栈:

 $ docker stack deploy --compose-file=docker-compose.yml secret_test

这将创建 web 服务的一个实例,名为 secret_test_web

5.验证服务创建的容器是否有两个secret

使用 docker exec -ti [container] /bin/sh 验证机密是否存在。

(注意:在下面的 docker exec 命令中, m2jgac... 部分在您的机器上会有所不同。运行 docker ps 以查找您的容器名称。)

 $ docker exec -ti secret_test_web.1.m2jgacogzsiaqhgq1z0yrwekd /bin/sh

# Now inside secret_test_web; secrets are contained in /run/secrets/
root@secret_test_web:~$ cd /run/secrets/

root@secret_test_web:/run/secrets$ ls
my_external_secret  my_file_secret

root@secret_test_web:/run/secrets$ cat my_external_secret
This is an external secret

root@secret_test_web:/run/secrets$ cat my_file_secret
This is a file secret.

如果一切顺利,我们在第 1 步和第 2 步中创建的两个秘密应该在我们部署堆栈时创建的 web 容器中。

原文由 Mike Hearn 发布,翻译遵循 CC BY-SA 4.0 许可协议

假设您有一个服务 myapp 和一个秘密文件 secrets.yml

创建一个撰写文件:

 version: '3.1'

services:
  myapp:
    build: .
    secrets:
      secrets_yaml

使用以下命令配置密钥:

 docker secret create secrets_yaml secrets.yml

使用以下命令部署您的服务:

 docker deploy --compose-file docker-compose.yml myappstack

现在您的应用程序可以访问 /run/secrets/secrets_yaml 的秘密文件。您可以在应用程序中硬编码此路径或创建符号链接。


不一样的问题

这个答案可能是针对“你如何为你的 docker swarm 集群提供你的秘密”这个问题的。

最初的问题“你如何使用 docker compose 管理秘密值”意味着 docker-compose 文件包含秘密值。它没有。

还有一个不同的问题:“您将 secrets.yml 文件的规范源存储在哪里”。这取决于你。您可以将其存储在您的脑海中,在一张纸上打印,使用密码管理器,使用专用的秘密应用程序/数据库。哎呀,如果它本身安全,你甚至可以使用 git 存储库。当然,永远不要将它存储在你用它保护的系统中:)

我会推荐 保险库。要存储秘密:

 # create a temporary secret file
cat secrets.yml | vault write secret/myappsecrets -

要检索一个秘密并将其放入您的 docker swarm:

 vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -

当然,您可以使用 docker 集群本身作为您秘密的单一事实来源,但如果您的 docker 集群中断,您将丢失您的秘密。因此,请确保在其他地方进行备份。


没人问的问题

第三个问题(没有人问)是如何为开发人员的机器提供秘密。当存在无法在本地模拟的外部服务或无法复制的大型数据库时,可能需要它。

同样,docker 与它无关(还)。它没有访问控制列表来指定哪些开发人员可以访问哪些机密。它也没有任何身份验证机制。

理想的解决方案似乎是这样的:

  • 开发人员打开一些 Web 应用程序。
  • 使用一些单点登录机制进行身份验证。
  • 复制一些长长的 docker secret create 命令列表并在终端中执行它们。

我们还没有看到是否会弹出这样的应用程序。

原文由 Vanuan 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题