使用docker-compose run如何查看日志输出?

188

当我使用 docker-compose up 命令时,我可以看到我在 docker-compose.yml 文件中所有容器的日志。

然而,当我使用 docker-compose run app 命令时,我只能看到 app 的控制台输出,而看不到 app 依赖的其他服务的日志。如何查看其他服务的日志输出?


9
您可以使用 docker-compose logs -f 服务名称 - Xiongbing Jin
请注意,docker-compose run 每次执行时都会创建新的容器。 - jazgot
1
我在CircleCI中运行docker-compose run来运行我的测试,所以如果它创建一个新的容器,那么没关系。主要问题只是看不到依赖服务的日志输出。 - sthomps
3
我有些困惑,如何查看docker-compose.yml文件中容器的日志?日志会写入该文件吗? - Robert Sinclair
4个回答

266

在撰写本文时,docker-compose run命令没有提供一个开关来查看其他服务的日志,因此您需要使用docker-compose logs命令来查看您想要的日志。

2022年6月10日更新

正如@Sandburg所评论的那样,docker compose现在已经集成到docker中。如here所述,大多数docker compose命令可以以相同的方式调用,只需去掉连字符即可。因此,使用docker compose代替docker-compose

新的Compose V2支持将compose命令作为Docker CLI的一部分,现已推出。

Compose V2将compose功能集成到Docker平台中,继续支持大多数先前的docker-compose功能和标志。您可以通过将连字符(-)替换为空格,使用docker compose而不是docker-compose来运行Compose V2。

2019年7月1日更新

docker-compose logs <name-of-service>

适用于所有服务

docker-compose logs

请使用文档中的以下选项:

用法:logs [选项] [SERVICE...]

选项:

--no-color 产生单色输出。

-f, --follow 跟随日志输出。

-t, --timestamps 显示时间戳。

--tail="all" 每个容器从日志末尾显示的行数。

查看Docker日志

您可以在分离模式下启动Docker compose,并稍后附加到所有容器的日志。如果您完成了观看日志,可以从日志输出中分离自己而不关闭服务。

  1. 使用 docker-compose up -d 命令以分离模式-d)启动所有服务(在分离模式下,您将看不到任何日志)
  2. 使用 docker-compose logs -f -t 命令附加所有正在运行的服务的日志,其中 -f 表示您跟随日志输出,-t 选项提供时间戳(请参见 Docker reference
  3. 使用 Ctrl + zCtrl + c 命令分离您自己与日志输出而不关闭正在运行的容器

如果您对单个容器的日志感兴趣,可以使用 docker 关键字:

  1. 使用 docker logs -t -f <name-of-service>

保存输出

要将输出保存到文件中,您需要在日志命令中添加以下内容:

  1. docker-compose logs -f -t >> myDockerCompose.log

28
我不知道为什么这个回答被接受了。问题是关于docker-compose run命令的,很多时候你会使用-rm选项来避免产生日志。我希望在运行脚本时能看到它的输出。 - James O'Brien
6
虽然这是有用的信息,但这并不是问题的答案。正如@JamesO'Brien所说,问题是关于docker-compose run和连接到那些具有在docker.compose.yml中列出的服务名称之外的独特名称的服务的。 - TetraDev
2
我认为每个文档都缺少一个关键的东西:由docker-compose run启动的容器实例不算作docker-compose所指的“服务”。docker-compose logs只会打印“服务”的日志。这就是为什么你不能使用docker-compose logs打印主命令的日志,所以如果你使用docker-compose run -d,你只能使用docker logs(而不是compose)命令来检查主任务的日志。 - GolDDranks
docker-compose 已经被整合到 Docker 中,并且已经改名为 docker compose,中间不再需要连接符。 - Sandburg
1
@HansRatzinger 感谢您的评论。我在链接的文档中没有找到有关在不使用连字符的情况下激活 docker compose 的任何提示。您能否进一步解释一下?如果我可以指向文档,我正在考虑改进我的答案。 - Bruno Bieri
显示剩余4条评论

47
如果您想在终端中查看所有服务的输出日志。
docker-compose logs -t -f --tail <no of lines> 

例如: 假设你想记录所有服务的最后5行输出
docker-compose logs -t -f --tail 5
如果您希望记录特定服务的输出,则可以按以下方式执行:
docker-compose logs -t -f --tail <no of lines> <name-of-service1> <name-of-service2> ... <name-of-service N>

用法: 例如,假设您有API和门户服务,则可以执行以下操作: docker-compose logs -t -f --tail 5 portal api 其中5表示从两个日志中获取最后5行。
参考:https://docs.docker.com/v17.09/engine/admin/logging/view_container_logs/

另一个提示,您可以发出 --tail 标志以获取所有日志。 - n8jadams

15
  1. 使用以下命令以分离模式启动容器: docker-compose up -d
  2. 查看容器使用以下命令:docker ps
  3. 查看容器日志使用以下命令:docker logs <containerid>

6

很遗憾,我们需要单独运行docker-compose logs而不是与docker-compose run一起运行。为了使其可靠地工作,我们需要抑制docker-compose run的退出状态,然后重定向日志并用正确的状态退出。

#!/bin/bash
set -euo pipefail
docker-compose run app | tee app.log || failed=yes
docker-compose logs --no-color > docker-compose.log
[[ -z "${failed:-}" ]] || exit 1

以上的功能在Windows系统中有对应的吗? - Espresso
2
@Espresso,好的。(docker-compose --verbose up | Tee-Object build.log) || ($env:FAILED='yes')。我无法完整回答,因为那需要线程处理。我认为模拟bash的pipefail不值得。相反,请查看Start-TreadJob和https://learn.microsoft.com/en-us/dotnet/api/system.threading.semaphore?view=net-6.0。 - Mavaddat Javid

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