`docker stack` 特定的日志位置

`docker stack` specific log locations

有没有办法在已部署的 docker 堆栈上使用 docker-compose.yml 文件指定日志文件?

我在 docker 集群 docker 服务和堆栈 运行 上一直遭受间歇性崩溃,没有留下任何日志痕迹,我需要一些循环日志,我可以看看这些什么时候发生

我的docker info输出:

$ docker info
Containers: 114
 Running: 4
 Paused: 0
 Stopped: 110
Images: 95
Server Version: 17.09.0-ce
Storage Driver: overlay2
 Backing Filesystem: extfs
 Supports d_type: true
 Native Overlay Diff: true
Logging Driver: json-file
Cgroup Driver: cgroupfs
Plugins:
 Volume: local
 Network: bridge host macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog

根据您关于旋转日志的问题,您可以为堆栈文件中的每个服务添加以下选项:

  logging:
   driver: "json-file"
   options:
      max-size: "5m"
      max-file: "3"

您还可以使用 docker 服务日志 service_name 查看特定服务的日志。

默认情况下,当容器退出时它不会被删除,因此您始终可以看到它的日志。

编辑

您可以使用以下命令将其重定向到文件中(-f 标志跟随输出)

(nohup docker service logs service -f  >> /path-to-file/file.log)&

然后检查哪个 docker 服务日志输出已经重定向。

ps aux | grep "docker service logs"

有多种原因可能导致您得不到想要的东西。

  1. 是的,上面的@hichamx 是正确的,您可以更改服务的默认 JSON 日志驱动程序的文件大小设置,但这可能不是您的问题。

  2. 删除容器时也会删除日志。使用 Swarm 服务,那些 "tasks" 只在 Task History Retention Limit 周围徘徊,如 docker info 所示。这默认为 5,这意味着 4 个旧任务将挂起。如果您的服务任务在启动后很快崩溃,您就会明白……日志不会很长。使用 docker swarm update --task-history-limit 设置更大的数字,disk-space 允许。

  3. docker service logs 仅显示您的应用向 stdout/stderr 容器内报告的内容。它们不会向您显示 Swarm 编排器正在执行的操作。为此使用 docker events。它不会存储太多历史记录,因此您需要将 运行 保留在 shell 中或以其他方式捕获它作为历史记录。 events 告诉你容器 creation/deletion/failure.

  4. 理想情况下,如果它是应用程序在内部执行的操作,它会在退出时报告错误,docker 将存储在 .State.Error 下的容器检查元数据中。单衬垫很酷,但有时不如我们需要的那样灵活。这是一个示例,它首先列出 a 中的所有任务,然后获取每个任务的容器 ID,然后检查每个容器并显示错误(如果有)。不幸的是,它仅适用于您所连接的本地服务器上的容器,但希望您了解每个 $() .

  5. 中的嵌套命令

docker inspect -f "{{.State.Error}}" $(docker inspect -f "{{.Status.ContainerStatus.ContainerID}}" $(docker service ps <servicename> -q))