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

Iva*_*hek 40 docker docker-compose

我正在使用docker-compose.

一些命令喜欢up -d service_namestart service_name正在立即返回,如果您不希望运行的容器依赖于 shell 的状态,这非常有用,就像它们对常规up service_name. 一个用例是从某种连续的集成/交付服务器运行它。

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

命令Docker Compose CLI 参考up确实提到了相关选项,但是,对于 version 1.7.1,它与-d以下内容互斥:

--abort-on-container-exit  Stops all containers if any container was stopped.
                           *Incompatible with -d.*
Run Code Online (Sandbox Code Playgroud)

我可以以某种方式手动检查容器是否确实在工作并且没有因为某些错误而停止吗?

elq*_*sta 29

  • 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
Run Code Online (Sandbox Code Playgroud)

docker ps默认情况下显示短版本的 ID,因此我们需要指定--no-trunc标志。

更新:如果服务没有运行,它会抛出“grep 使用”警告。感谢@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
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用重启策略,您还需要过滤它以仅包含正在运行的容器(而不是处于重启状态的容器):`docker ps -q -f "status=running" --no-trunc | grep $(docker-compose ps -q &lt;service_name&gt;)` (3认同)
  • @elquimista 是的,我使用 OR 运算符解决了它:```if [ -z `docker-compose ps -q mysql` ] || [ -z `docker ps -q --no-trunc | grep $(docker-compose ps -q mysql)`]; 然后```。它的作用是:它首先检查服务是否存在(即使它已停止),第二部分检查现有服务是否实际运行。您可能希望将其包含在您的示例中,以供将来仅浏览已接受答案的读者使用。我认为它很有用。 (2认同)

Iva*_*hek 16

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

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

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

~/apperture-science $ docker-compose exec chell echo 'Still alive!'
Still alive!
~/apperture-science $ echo $?
0
Run Code Online (Sandbox Code Playgroud)

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

~/apperture-science $ docker-compose exec glados echo "Still alive!"
ERROR: No container found for apperture-science-glados_1
~/apperture-science $ echo $?
1
Run Code Online (Sandbox Code Playgroud)

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


小智 9

查看所有正在运行的服务:

docker-compose ps --services --filter "status=running"
Run Code Online (Sandbox Code Playgroud)

要查看您的服务是否正在运行:

docker-compose ps --services --filter "status=running" | grep <your-service>
Run Code Online (Sandbox Code Playgroud)

请注意,出于某些外国原因--filter必须使用 with --services


小智 6

你可以运行:

docker-compose ps -q service-name
Run Code Online (Sandbox Code Playgroud)

如果service-name正在运行,您将获得容器的 id 。就像是:

18a04e61240d8ffaf4dc3f021effe9e951572ef0cb31da7ce6118f681f585c7f
Run Code Online (Sandbox Code Playgroud)

如果服务未运行,则输出为空,因此如果您想在脚本中使用它,您可以执行以下操作:

IS_RUNNING=`docker-compose ps -q service-name`
if [[ "$IS_RUNNING" != "" ]]; then
    echo "The service is running!!!"
fi
Run Code Online (Sandbox Code Playgroud)

  • 这不会告诉你容器是否正在运行,只是它是否存在。尝试执行 `docker-compose up` 然后按 Ctrl-C。`docker-compose ps` 应该显示容器状态_not_“Up”,但是 `docker-compose ps -q service-name` 仍然给你一个 id。 (16认同)