如何向多个 Docker Swarm Stacks 提供全局 .htpasswd 文件?

How to provide a global .htpassword file to multiple Docker Swarm Stacks?

我 运行 在一个 docker swarm 主机上有大约 20 个服务堆栈,它们都公开了各自的 https 前端,这些前端由使用 Traefik 的基本身份验证保护(所有服务的用户名和密码相同)。

我希望集中管理 .htpassword 文件或 username/passwordHash,这样如果需要更改密码,我可以做一次,它会立即或在重新部署后影响所有服务。我正在使用 Swarmpit 来编排 Docker Swarm。

我查看了 Docker 秘密和 Docker 配置,但如果 运行 服务主动使用,两者似乎都是不可变的。我也想过环境变量,但是实在找不到办法。

我该怎么办?

您可以对共享卷执行此操作,将文件放在一个卷中并让所有容器安装该卷。如果 swarm 容器分布在多个节点上,您将需要安装网络卷(例如 NFS),或单独更新每个主机上的卷。

这种用例正是 docker 秘密或 docker 配置旨在解决的问题。您将文件的内容注入 secret/config,docker 会自动将其部署到服务所在的每个节点 运行。

是的,这些是不可变的。而且您不会在现有容器中热交换这些。当您进行更改并且它由 swarm 管理时,您将获得服务的滚动更新。我在我的环境中管理它所做的是注入 secret/config 的版本号作为环境变量,并使用脚本更新该变量。我在此处获得了该脚本和示例用法:https://github.com/sudo-bmitch/docker-config-update

如果你不想为此使用 docker secrets/configs 那么你可以执行以下操作(对于 Traefik 2.1):

首先在你的traefik配置中添加一个动态配置目录

--providers.file.directory=/my/path/to/dynamic/conf
--providers.file.watch=true

在此位置安装一个卷并创建您的中间件文件(例如middlewares.yml)

http:
  middlewares:
    defaultAuth:
      basicAuth:
        users:
          - "admin:$apr1r2hvw0$Oljx0V7CwdQJG7WxLWRVt0" # correcthorsebatterystaple

现在您可以编辑用户数组,traefik 会自动选择更改。

要使用中间件,只需在您的 docker 标签上引用它即可:

- traefik.http.routers.<my_router_name>.middlewares=defaultAuth@file

对于 traefik 1.x 你可以添加以下标签

- traefik.frontend.auth.basic.usersFile=/path/.htpasswd

然后在需要时更新文件并重新启动受影响的服务。我不再使用 1.x,所以没有测试过。