使用 docker-compose 检查容器/服务是否正在运行

使用 docker-compose 检查容器/服务是否正在运行

我正在使用docker-compose

某些命令(例如up -d service_name或 )start service_name会立即返回,如果您不希望容器的运行依赖于 shell 的状态(就像它们对常规 所做的那样),这非常有用。up service_name一个用例是从某种持续集成/交付服务器运行它。

但是这种运行/启动服务的方式不会提供任何有关服务实际状态的反馈。

Docker Compose CLI 命令up参考确实提到了相关选项,但是,就版本而言1.7.1,它与以下内容互斥-d

--abort-on-container-exit  Stops all containers if any container was stopped.
                           *Incompatible with -d.*

我能否以某种方式手动检查容器确实在运行并且没有因为某些错误而停止?

答案1

  • docker-compose ps -q <service_name>无论容器是否正在运行,只要它被创建,就会显示容器 ID。
  • docker ps仅显示实际正在运行的。

让我们把这两个命令结合起来:

if [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q <service_name>)` ]; then
  echo "No, it's not running."
else
  echo "Yes, it's running."
fi

docker ps默认显示简短版本的 ID,所以我们需要指定--no-trunc标志。

更新:如果服务未运行,它会抛出“grep usage”警告。感谢@Dzhuneyt,这是更新后的答案。

if [ -z `docker-compose ps -q <service_name>` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q <service_name>)` ]; then
  echo "No, it's not running."
else
  echo "Yes, it's running."
fi

答案2

查看全部正在运行的服务:

docker-compose ps --services --filter "status=running"

看看是否您的服务在跑:

docker-compose ps --services --filter "status=running" | grep <your-service>

请注意,由于某些外部原因,--filter必须与一起使用。--services

答案3

至于版本1.7.1,没有内置这样的命令。

相反,exec可以以类似的方式使用。

当你为具有一些容器的服务运行它时它将正常运行:

~/apperture-science $ docker-compose exec chell echo 'Still alive!'
Still alive!
~/apperture-science $ echo $?
0

但是当你为没有运行的服务运行它时服务容器时,将显示错误:

~/apperture-science $ docker-compose exec glados echo "Still alive!"
ERROR: No container found for apperture-science-glados_1
~/apperture-science $ echo $?
1

因此,它可以用于检查给定服务是否有任何“活跃”的容器。

答案4

这是一个返回服务当前状态的简单代码:

docker inspect --format "{{.State.Status}}" $(docker-compose ps -q your_service_name)

这仅返回 docker 容器的状态。如果你想检查应用程序的实际状态,你应该将 HEALTHCHECK 添加到 Dockerfile 中(https://docs.docker.com/engine/reference/builder/#healthcheck)。之后你可以使用以下命令进行检查:

docker inspect --format "{{.State.Health.Status}}" $(docker-compose ps -q your_service_name)

相关内容