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


72

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'

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


您确定docker-compose已经支持机密了吗?docker-compose您正在运行哪个版本?
fzgregor

$ docker-compose --version返回:docker-compose version 1.11.0, build 6de1806,所以是的,它应该根据发行说明支持机密。
艾瑞克(Eric)

晚了晚会,但这不是秘密吗?不是秘密吗?
Wellspring '18

Answers:


124

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

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

例如,创建Docker将了解的两种类型的秘密:外部秘密和文件秘密。

1.使用以下命令创建“外部”秘密 docker secret create

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

$ 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.验证由服务创建的容器具有两个秘密

使用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部署堆栈时创建的容器内。


1
当我运行您指定的第一个命令时,我得到以下结果:Error response from daemon: This node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again.我很困惑!我是否需要启动集群才能将docker-compose与机密一起使用?
埃里克

2
糟糕,是的。该docker stack deploy命令是Swarm引擎的一部分。我将在步骤1中添加一行以表明这一点。
Mike Hearn

4
我不明白其背后的原因。矿山和许多其他用例不需要一群,但需要秘密。如果我们只想要秘密,为什么要让我们大量使用呢?
埃里克

2
@Vanuan,因为我需要一些秘密才能在我的远程计算机(而不只是本地计算机)上启动容器。例如,官方的owncloud映像具有docker -compose.yml,要求您将MySQL密码记为环境变量,这是不正确的做法。我以为码头工人的秘密会解决这个问题?
埃里克

4
如果您使用的不是外部文件,则从1.11开始,在docker-compose w / o swarm中可用的机密,但请注意,它们不安全,因为compose不是生产工具,就像这里所说的那样,没有加密的地方就无法存储它们群筏数据库 如果您在撰写文件中正确定义了基于文件的机密,则docker-compose会将文件绑定安装到/ run / secrets中,以模拟swarm在本地工作时所做的工作,从而简化开发人员的工作流程。如果您需要在单节点服务器上进行安全存储,则可以初始化一个单节点集群,它可以正常工作。
Bret Fisher

16

如果您有一项服务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群集群”的问题。

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

还有一个不同的问题:“您在哪里存储规范的来源 secrets.yml文件”。这取决于你。您可以将其存储在头上,在纸上打印,使用密码管理器,或使用专用的机密应用程序/数据库。哎呀,如果它已经安全地保护了自己,您甚至可以使用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群集中断,您将丢失您的机密。因此,请确保在其他地方进行备份。


没有人问的问题

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

再次说明,泊坞窗与此无关(至今)。它没有访问控制列表,该列表指定哪些开发人员有权访问哪些机密。它也没有任何身份验证机制。

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

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

我们尚未看到是否弹出这样的应用程序。


docker secret create 似乎要求有一个预先存在的群体?我需要创建一个吗?
艾瑞克(Eric)

@Eric那么您以开发人员的身份运行它吗?恐怕Docker还不支持该用例。但是,是的,您可以创建仅由您的开发人员机器组成的docker群。这超出了这个问题的范围。
Vanuan

自2月8日起,docker-compose 1.11在本地开发人员的撰写文件中支持基于文件的机密。有关详细信息,请参阅我对所选答案的评论:)
Bret Fisher

@BretFisher但如果与使用volume的指定本质上相同,那又有什么意义./file_based_secret:/run/secrets/my_secret呢?
Vanuan

@Vanuan对,容器没有功能上的区别。这是关于无缝的工作流程,并限制了多个compopse文件的需求。
Bret Fisher

10

您还可以secrets使用file:key insecrets对象指定本地存储在文件中。然后,您不必docker secret create自己动手,撰写/docker stack deploy将为您完成。

version: '3.1'

secrets:
  password:
    file: ./password

services:
  password_consumer:
    image: alpine
    secrets:
      - password

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


如何在password文件中定义多个变量?
Jinna Balu

1

那是docker-compose.yml文件的确切缩进吗?我认为 应该嵌套在(即服务之一)下,而不是直接在节下。secret secretsaservices


是的,那是确切的缩进。我尝试将secret字典嵌套在下a(也与处于同一级别services),并得到了相同的结果。
埃里克

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.