首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用docker-组合v3.1管理秘密值?

如何使用docker-组合v3.1管理秘密值?
EN

Stack Overflow用户
提问于 2017-02-09 14:42:47
回答 6查看 153.4K关注 0票数 105

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

我试过这个:

代码语言:javascript
复制
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'

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2017-02-10 04:32:44

你可以读正式文件中的相应部分

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

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

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

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

代码语言:javascript
复制
$ docker swarm init

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

代码语言:javascript
复制
$ echo "This is an external secret" | docker secret create my_external_secret -

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

2.将另一个秘密写入档案

代码语言:javascript
复制
$ echo "This is a file secret." > my_file_secret.txt

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

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

代码语言:javascript
复制
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.部署测试堆栈

使用以下方法部署堆栈:

代码语言:javascript
复制
$ 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以查找容器名称。)

代码语言:javascript
复制
$ 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容器中。

票数 183
EN

Stack Overflow用户

发布于 2017-02-10 03:53:11

如果您有一个服务myapp和一个机密文件secrets.yml

创建一个撰写文件:

代码语言:javascript
复制
version: '3.1'

services:
  myapp:
    build: .
    secrets:
      secrets_yaml

使用此命令提供秘密:

代码语言:javascript
复制
docker secret create secrets_yaml secrets.yml

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

代码语言:javascript
复制
docker deploy --compose-file docker-compose.yml myappstack

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

不同的问题

这个问题的答案可能是“您如何将您的秘密提供给您的停靠群群”。

最初的问题“如何使用停靠者撰写来管理秘密值”意味着坞-组合文件包含秘密值。事实并非如此。

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

我推荐金库。为了保存秘密:

代码语言:javascript
复制
# create a temporary secret file
cat secrets.yml | vault write secret/myappsecrets -

去找回一个秘密并把它放到你的码头群里:

代码语言:javascript
复制
vault read -field=value secret/myappsecrets | docker secret create secrets_yaml -

当然,您可以使用docker集群本身作为秘密的单一来源,但是如果您的停靠集群中断,您就丢失了您的秘密。所以一定要在其他地方有后援。

--没人问的问题

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

再说一次,码头与它没有任何关系(目前)。它没有指定哪些开发人员可以访问哪些秘密的访问控制列表。它也没有任何认证机制。

理想的解决办法似乎是:

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

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

票数 19
EN

Stack Overflow用户

发布于 2017-04-04 20:52:01

还可以使用secrets对象中的file:键指定本地存储在文件中的secrets。然后你就不用自己做docker secret create了,撰写/ docker stack deploy会为你做的。

代码语言:javascript
复制
version: '3.1'

secrets:
  password:
    file: ./password

services:
  password_consumer:
    image: alpine
    secrets:
      - password

参考资料:撰写文件第3版参考:机密

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42139605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档