为什么 Docker Stack Deploy 仅在远程 Jenkins 部署时出现 Swarm Manager 错误?

Why does Docker Stack Deploy have Swarm Manager Error only with remote Jenkins deploy?

所以我有一个基本映像,并且已经在本地和通过 SSH 进行了测试,它工作正常。但是当我尝试通过 Jenkins sh 部署它时,问题就出现了。

当我远程进入实例并运行以下内容时:

docker stack deploy --compose-file=simpleTest.yml simpleTestService

我的服务工作正常。但是,当我的詹金斯代理 运行 执行相同的命令时 - 我得到

node is not a swarm manager. Use "docker swarm init" or "docker swarm join" to connect this node to swarm and try again

我不确定为什么会这样?是因为我需要告诉 Jenkins Agent 加入 Swarm Manager(如何?)

这是我的示例 .yml。据我所知,docker-compose 版本由我在 YML 中的“3”决定,我的 Docker 版本是 19.03.13-CE。我的 Jenkins Agent 在不同的实例上,我从存储库中提取图像并将其推送到目标实例(Docker 所在的位置)。信息显示 Swarm 处于活动状态并且它是管理器。当我在实际实例上 运行 时,我编辑了图像名称以包含我的存储库中存在的构建的名称和标签(我使用了与 Jenkins 相同的图像和标签来排除任何奇怪的不一致出)。

version: "3"
services:
  app:
    image: "${FULLNAMEWITHTAG}"
    container_name: SimpleTest
    restart: always
    environment:
      NODE_ENV: production
    build: .
    ports:
      - "9001:9001"

要将堆栈部署到的节点必须位于集群中才能执行此操作。不确定你是如何配置 Jenkins 的,但为了安全起见,你可以只初始化 swarm(也许它正在你正在执行命令的节点上工作,但 Jenkins 使用另一个代理......仔细检查!)。

错误消息已经告诉你解决方案,只需让 Jenkins 运行 成为 docker swarm init 命令即可。你如何完成取决于。以下是声明性管道的示例:

steps {
   [...]
   sh 'docker swarm init'
   [deploy the stack]
}

我通过安装 SSH 插件并让 Jenkins SSH 执行命令解决了这个问题。这样,它实际上将堆栈部署为 Swarm Manager。

除非明确告知这样做,运行 带有 Docker Swarm 的 SH 脚本不会自动加入 Swarm 或作为工作节点执行操作。所以你需要加入 Swarm 或 SSH 到盒子里(并因此充当管理员)