【问题标题】:Docker swarm LetsEncrypt nginx container writing to /var/logDocker swarm LetsEncrypt nginx 容器写入 /var/log
【发布时间】:2020-08-26 05:39:19
【问题描述】:

我有一个跨 4 个树莓派(1 个经理,3 个工人)运行的 docker swarm。今天,当我在主节点上诊断崩溃并发现在该主机上运行的容器进程正在将其日志写入主机上的 /var/log 时,我有点惊讶。

我认为默认情况下(我的 swarm 使用这里的 docker 指令https://docs.docker.com/engine/swarm/swarm-tutorial/create-swarm/ 中的默认/基本配置),docker 将其日志作为一部分写入 json-log 输出Docker自己在主机上的日志结构。是我看到的预期行为,还是我严重错误配置/误解了什么?

例如,为我的 swarm 运行 nginx 入口节点的letsencrypt 映像正在将其日志写入我主机上的/var/log/letsencrypt。如果没有我在容器规范中明确挂载 /var/log 目录,我不会想到这可能。

似乎正在将这些 certbot 调试日志写入主机上的 /var/log/letsencrypt/letsencrypt.log:

2020-07-19 07:11:46,615:DEBUG:certbot.main:certbot version: 0.31.0
2020-07-19 07:11:46,616:DEBUG:certbot.main:Arguments: ['-q']
2020-07-19 07:11:46,616:DEBUG:certbot.main:Discovered plugins: PluginsRegistry(PluginEntryPoint#manual,PluginEntryPoint#null,PluginEntryPoint#standalone,PluginEntryPoint#webroot)
2020-07-19 07:11:46,638:DEBUG:certbot.log:Root logging level set at 30
2020-07-19 07:11:46,639:INFO:certbot.log:Saving debug log to /var/log/letsencrypt/letsencrypt.log

这是我的 nginx docker-compose 文件:

version: '3'
services:
  nginx:
    image: linuxserver/letsencrypt
    volumes:
      - /share/data/nginx/:/config
    deploy:
      mode: replicated
      placement:
        constraints:
          - "node.role==manager"
    ports:
      - 80:80
      - 443:443
    environment:
      - PUID=1001
      - PGID=1001
      - URL=mydomain.com
      - SUBDOMAINS=www,mysite1,mysite2
      - VALIDATION=http
      - EMAIL=myemail@myprovider.com
      - TZ=Europe/London
    networks:
      - internal
      - monitoring_front-tier

networks:
  internal:
    external: true
  monitoring_front-tier:
    external: true

【问题讨论】:

    标签: docker-swarm


    【解决方案1】:

    您可以检查该容器上配置了哪个日志记录驱动程序:

    docker inspect -f '{{.HostConfig.LogConfig.Type}}' <container-id>
    

    您可以根据官方文档将结果与应有的行为进行比较:https://docs.docker.com/config/containers/logging/configure/#supported-logging-drivers

    您还可以检查是否选择覆盖 /etc/docker/daemon.json 下的默认 json-file 日志记录驱动程序。如果该文件不存在,则 json-file 驱动程序应该是正在使用的驱动程序。

    【讨论】:

    • 我的 nginx 容器设置为 json-file。看起来我的 daemon.json 只设置了 2 个标志。一个用于 prometheus 指标,另一个用于“experimental=true”
    • 通常图像将它们的日志发送到 /dev/stdout。我查看了您正在使用的图像 Dockerfile。这两行定义了日志应该发送到哪里:github.com/linuxserver/docker-letsencrypt./blob/…。也许该路径中有一个挂载点指向 /var/log 的另一端。您可以在容器中查看并查看
    • 或者,您可以使用access_log /dev/stdout; error_log /dev/stdout; 更改这两行。然后应该由json-file 日志驱动程序获取日志。
    • 好地方,但没有从挂载路径到 /var/log 的链接。我确实按预期看到了该路径中的访问日志和错误日志。也许我应该直接在letsencrypt github页面上发布这个问题,如果我找到答案,请在这里写回
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    • 2022-10-19
    • 1970-01-01
    • 2018-10-17
    • 1970-01-01
    相关资源
    最近更新 更多