如何用docker-compose v3.1pipe理秘密值?

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

我试过这个:

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

$ docker-compose up returns:

Unsupported config option for services.secret: 'password'

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

您可以从官方文档中阅读相应的章节 。

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

举个例子,创buildDocker会理解的两种types的秘密: 外部秘密和文件秘密。

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

首先,要使用Docker的秘密,您所在的节点必须是群集的一部分。

 $ docker swarm init 

接下来,创build一个“外部”秘密:

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

(一定要包括最后的破折号, -很容易错过。)

2.在文件中写入另一个秘密

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

3.创build一个使用两个秘密docker-compose.yml文件

现在创build了这两种types的秘密,这里是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制作的docker secret create )或从文件中读取秘密。 以上显示了这两个例子。

4.部署您的testing堆栈

使用以下方法部署堆栈:

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

这将创build一个名为secret_test_webweb服务实例。

5.确认由服务创build的容器同时具有两个秘密

使用docker exec -ti [container] /bin/sh来validation是否存在秘密。

(注意:在下面的m2jgac... docker exec命令中, m2jgac...部分在你的机器上是不同的,运行docker psfind你的容器名。)

 $ 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中创build的两个秘密应该在我们部署堆栈时创build的web容器内部。

鉴于你有一个服务myapp和一个秘密文件secrets.yml

创build一个撰写文件:

 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访问秘密文件。 您可以在应用程序中对此path进行硬编码,也可以创build符号链接。


不同的问题

这个答案可能是“你如何将你的秘密提供给你的docker群集群”的问题。

原来的问题“你如何pipe理docker组成的秘密值”意味着docker组成文件包含秘密值。 它不。

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

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

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

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

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

当然,您可以使用docker集群本身作为您的秘密的单一来源,但是如果您的docker集群发生故障,您将失去秘密。 所以请确保在其他地方有一个备份。


这个问题没人问

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

再一次,docker工人与它无关(但)。 它没有访问控制列表,指定哪些开发者有权访问哪些秘密。 它也没有任何authentication机制。

理想的解决scheme似乎是这样的:

  • 开发人员打开一些Web应用程序。
  • 使用一些单点login机制进行身份validation。
  • 复制一些docker secret create命令的长列表,并在terminal中执行它们。

我们还没有看到这样的应用程序popup。

您还可以使用密钥对象中的file: key指定保存在本地的secrets 。 那么你不必自己docker secret create ,Compose / docker stack deploy就可以为你做。

 version: '3.1' secrets: password: file: ./password services: password_consumer: image: alpine secrets: - password 

参考: 撰写文件版本3参考:秘密

我猜关键字是secrets不是secret 。 这至less是我通过阅读模式所理解的。

这是你docker-compose.yml文件的确切缩进吗? 我认为 secret secrets应该嵌套在(即服务之一)下,而不是直接隶属于services部门。