微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么 Docker Stack Deploy 只有在远程 Jenkins 部署时才会出现 Swarm Manager 错误?

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

当我远程进入实例并运行以下命令时:

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

我的服务运行良好。但是,当我的 Jenkins 代理运行相同的命令时 - 我得到

node 不是群管理器。使用“docker swarm init”或“docker swarm” 加入”以将此节点连接到 swarm 并重试

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

这是我的示例 .yml。据我所知,docker-compose 版本由我在 YML 中的“3”决定,我的 Docker 版本是 19.03.13-CE。我的 Jenkins 代理位于不同的实例上,我从存储库中提取映像并将其推送到目标实例(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 加入到框中(从而充当管理员)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。