14

我正在玩一个单一的容器泊坞窗图像。我想在不使用 compose 的情况下将我的 db 密码存储为秘密(现在有问题和 Gradle)。我以为即使没有撰写,我仍然可以使用秘密,但是当我尝试时,我得到...

$ echo "helloSecret" | docker secret create helloS -

来自守护进程的错误响应:此节点不是集群管理器。使用“docker swarm init”或“docker swarm join”将此节点连接到swarm,然后重试。

为什么我需要使用 swarm 模式才能使用秘密?为什么我不能在没有集群的情况下使用它们?

4

2 回答 2

10

您需要为秘密运行 swarm 模式,因为这就是 docker 实现秘密的方式。秘密的价值在于工作人员永远不会将秘密写入磁盘,秘密是在需要知道的基础上(其他工作人员在安排任务之前不会收到秘密),并且管理人员在磁盘上加密该秘密。管理器上的秘密存储使用 raft 数据库。

您可以使用命令轻松部署单节点 swarm 集群docker swarm init。从那里,docker-compose up更改为docker stack deploy -c docker-compose.yml $stack_name.


swarm 模式下的 Secrets 和 configs 提供了将单个文件卷安装到容器中进行配置的替代方法。因此,如果在单个节点上没有 swarm 模式,您始终可以进行以下定义:

version: '2'
services:
  app:
    image: myapp:latest
    volumes:
    - ./secrets:/run/secrets:ro

或者,您可以通过将这些秘密加载到命名卷中,将这些秘密与您的应用程序稍微分开。为此,您可以执行以下操作:

tar -cC ./secrets . | docker run -i -v secrets:/secrets busybox tar -xC /secrets

然后挂载该命名卷:

version: '2'
volumes:
  secrets:
    external: true
services:
  app:
    image: myapp:latest
    volumes:
    - secrets:/run/secrets:ro
于 2019-01-31T13:54:20.210 回答
4

看看这个答案:https ://serverfault.com/a/936262 由用户 sel-en-ium 提供:-

如果您使用撰写文件,则可以使用机密。(您不需要运行 swarm)。

您将 compose 文件与docker-compose一起使用:在 docker-compose.yml 文件中有“秘密”的文档

我切换到 docker-compose 因为我想使用秘密。我很高兴我做到了,它看起来更干净了。每个服务映射到一个容器。而且,如果您想切换到运行 swarm,那么您基本上已经在那里了。

不幸的是,这些秘密没有加载到容器的环境中,它们被挂载到 /run/secrets/

于 2019-01-31T12:42:56.090 回答