Docker Swarm循环问题

82次阅读
没有评论

问题描述

在使用Docker Swarm时遇到了一个问题。他创建了一个只有两个节点(一个主节点和一个从节点)的Docker Swarm,并使用以下命令启动了一个服务:

docker service create --mode global --name benchmark briomkez/ethereum-test

然而,这个服务一直在循环中,无法创建成功(默认命令是一个简单的ls命令)。
用户想知道为什么会出现这种情况,这是预期的吗?

如果使用不同的命令运行相同的服务,例如:

docker service create --mode global --name benchmark briomkez/ethereum-test geth

它就能正常工作。这种行为是否是预期的,循环的原因是什么?

解决方案

请注意以下操作注意版本差异及修改前做好备份。

解决方案1

Docker容器是独立的应用程序。当它启动的应用程序退出时,容器也会退出。因此,当你的命令是ls时,它会运行并几乎立即退出,停止容器的运行。

Swarm模式的目标是维护容器的目标状态。默认情况下,它会保持服务的单个副本(容器实例)运行。如果当前状态与目标状态不匹配,它将采取措施来纠正问题。因此,对于没有运行实例且目标副本计数为1的容器,它将不断启动。

所以,根据输入,这是一种预期的行为。你应该使用一个长时间运行的守护进程,而不是ls命令。

解决方案2

使用脚本或工具来管理容器的启动顺序可能会增加复杂性,并且需要确保容器A和容器B之间的依赖关系正确设置。
另一种方法是编写脚本或使用工具来控制容器的运行顺序。你可以使用docker run命令来手动控制容器的启动顺序,或者使用一些第三方工具来管理容器的依赖关系。

以下是一个简单的bash脚本示例,可以在容器A启动后启动容器B:

#!/bin/bash
# 启动容器A
docker run -d --name container_a your_image_a
# 等待容器A完全启动
while ! docker exec container_a echo "Container A is ready"; do
  sleep 1
done
# 启动容器B
docker run -d --name container_b your_image_b

在这个示例中,我们首先使用docker run命令启动容器A,并将其命名为container_a。然后,使用一个循环来等待容器A完全启动(这里是通过在容器内运行echo命令来测试)。一旦容器A就绪,我们再使用docker run命令启动容器B,并将其命名为container_b

以上是解决这个问题的两种方案,你可以根据自己的需求选择适合的方法。

正文完