如何检查docker-compose up -d命令的状态?

13
当我们使用docker-compose.yml文件运行docker-compose up -d命令时,它会开始构建镜像或从注册表中拉取镜像。我们可以在终端上看到这个命令的每一步。
我正在尝试从python脚本中运行此命令。命令成功启动,但是在命令之后,我不知道已完成多少进程。是否有任何方法可以监视docker-compose up -d命令的状态,以便脚本可以让用户(使用脚本的人)知道进程已经完成了多少,或者docker-compose命令因某些原因失败了?
谢谢
from pexpect import pxssh

session = pxssh.pxssh()
if not session.login(ip_address,<USERNAME>, <PASSWORD>):
    print("SSH session failed on login")
    print(str(session))
else:
    print("SSH session login successfull")
    session.sendline("sudo docker-compose up -d")
    session.prompt()
    resp = session.before
    print(resp)

“-d” 用于在后台运行容器。这将不会显示所有的日志。你能分享一下你的 Python 脚本吗? - arshovon
据我所知,除了检查容器是否已经启动之外,您只能观察日志以检查进度。 - shad0w_wa1k3r
5个回答

8
你可以通过以下方式查看docker compose日志:
  1. 使用docker compose up -d以分离模式(-d)启动所有服务(在分离模式下,您将看不到任何日志)
  2. 使用docker compose logs -f -t附加到所有正在运行服务的日志,其中-f表示您跟踪日志输出,-t选项为您提供美观的时间戳(Docs)

credit

编辑:Docker Compose现在作为核心Docker CLI的一部分提供。目前仍支持docker-compose,但我看到的大多数文档现在都将docker compose视为标准。有关更多信息,请参见https://docs.docker.com/compose/#compose-v2-and-the-new-docker-compose-command


docker-compose up -d命令成功运行并且我们需要监视日志时,docker-compose logs -f -t非常有用。如果docker-compose up -d显示任何错误,该怎么调试呢? - S Andrew
当在终端上直接运行docker-compose up -d命令时,如果失败了会显示错误信息。但是您正在使用Python脚本来运行它。您要如何运行shell命令? - Muhammad Hassan
我已添加了我正在使用的代码。我正在使用pexpect Python模块连接和运行ssh命令。问题是,如果我运行 sudo apt-get install <package> 命令,它会正常运行并将所有内容返回到变量 resp 中,但当我运行 sudo docker-compose up -d 时,它只显示给我一些东西,然后退出。 - S Andrew

4

我认为应该使用命令docker-compose top,可以检查结果,当容器正在运行时,结果不应为空。 如果容器处于停止退出创建状态,则应返回空值。


如果您之前已经有一个堆栈正在运行,那么这可能不正确。 - Neo.Mxn0

2
我通常用以下方法调试小问题:

运行:

docker-compose up {service_name} 

这样我就能看到单个服务的输出。如果该服务有依赖项,您可以像这样启动多个服务:

docker-compose up {service_name1} {service_name2}

此外,我还使用:
docker-compose logs -f -t {service_name1}

要查看已经运行的服务的日志,或者:

docker logs -t -f {container_name}

请注意,上述命令需要容器名称而不是服务名称
这样,您可以逐个服务地确保一切按预期工作,然后可以像其他答案中建议的那样以分离模式启动它们。

1
如果您需要使用编程方式,以下是最快的实现方法:
  • 等待2秒钟
  • 检查容器于几秒钟前启动 => 代表您已成功部署它

docker ps的输出结果将会是:

a6f088b1567e   lc_fe_isr-app   "docker-entrypoint.s…"   2 seconds ago   Up 2 seconds   0.0.0.0:10001->3000/tcp   lc_fe_isr-app-1

#!/bin/bash

#
# Check if the a single container was started successfully
#
CONTAINER_NAME="lc_fe_isr-app-1"
sleep 2
docker ps | grep $CONTAINER_NAME
UP_SECONDS_AGO=`docker ps | grep $CONTAINER_NAME | grep ' seconds'`
echo $UP_SECONDS_AGO

if [ -n "$UP_SECONDS_AGO" ]
then
    echo "Deploy successfully"
else
    echo "Deploy FAILED"
    exit 1
fi

0
我带来了一个更新的答案。要获取所有compose服务的当前状态,你可以使用docker compose ps命令,就像这样(我选择了最简单的格式来在脚本环境中操作它,随意阅读格式文档):
docker compose ps --format "{{.Service}} {{.State}}"

这样你应该得到类似这样的东西:
service1 running
service2 paused

状态可以是以下之一:[暂停 | 重启 | 移除 | 运行中 | 已停止 | 已创建 | 已退出] 注意: 如果您只想知道哪些服务正在运行,请在状态上添加一个过滤器,如下所示:
docker compose ps --services --satus=running

获取
service1

如果你需要的话,我可以给你我的makefile脚本。
status: ## Show status of services ✔
    @echo "`docker compose ps --all --format "#{{.State}}# \033[36m{{.Service}}\033[0m" | sed -e 's/#running#/✅/' | sed -r 's/#[a-z]+#/❌/'`"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接