日志旋转:Docker + nginx。无法重新加载 nginx 容器(logrotate:ALERT 异常退出 [1])

Logrotate: Docker + nginx. Can't reload nginx container (logrotate: ALERT exited abnormally with [1])

我有一个 logrotate 配置:

/opt/docker_folders/logs/nginx/*.log {
    dateext
    daily
    rotate 31
    nocreate
    missingok
    notifempty
    nocompress
    postrotate
    /usr/bin/docker exec -it nginx-container-name nginx -s reopen > /dev/null 2>/dev/null        
    endscript
    su docker_nginx root
}

文件夹权限:

drwxrwxr-x. 2 docker_nginx root   4096 Oct 13 10:22 nginx

nginx 是安装到 docker 容器的本地主机文件夹。
docker_nginx 是一个与容器内的 nginx 用户具有相同 uid 的用户(uid:101)。

如果我 运行 命令(作为 root)

# /sbin/logrotate -v /etc/logrotate.d/nginx_logrotate_config
# /sbin/logrotate -d -v /etc/logrotate.d/nginx_logrotate_config
# /sbin/logrotate -d -f -v /etc/logrotate.d/nginx_logrotate_config

所有工作都很有魅力。

问题: 但是当 cron 自动轮换日志时,我得到了错误

logrotate: ALERT exited abnormally with [1]

/var/log/messages

结果日志像往常一样旋转,但 nginx 不创建新文件(access.log,等等)。 看起来像 postrotate nginx -s reopen 脚本失败。

Linux版本为CentOS 7。 SELinux 已禁用。

问题: 至少怎么知道从 cron logrotate 运行ning 时发生了什么? 可能是什么问题?

PS我知道我也可以用docker重启。但我不想这样做,因为服务短时间断开连接。

PS2 另外我知道这是配置中的 nocreate 参数。那是因为我想通过nginx创建新的日志文件(避免新文件权限错误)。无论如何,如果 nginx -s reopen 真的失败了,nginx 有可能不会重新读取新创建的文件。

编辑 1:
我编辑了 /etc/cron.daily/logrotate 脚本并获取了日志。 关于问题只有一行。

error: error running non-shared postrotate script for /opt/docker_folders/logs/nginx/access.log of '/opt/docker_folders/logs/nginx/*.log '

所以我还是不明白是什么导致了这个问题...当我运行这个脚本手动所有运行宁罚款。

好的。自己回答。

-it 参数不能用于 cron 任务(而且 logrotate 也是一个 cron 任务)。 因为 cron 没有交互式会话 (TTY)。

我通过 运行 将 /usr/bin/docker exec -it nginx-container-name nginx -s reopen > /dev/null 2>/dev/null 作为 cron 任务解决了。我收到错误消息 "The input device is not a TTY"

所以我的新 logrotate 配置看起来像

/opt/docker_folders/logs/nginx/*.log {
    dateext
    daily
    rotate 31
    nocreate
    missingok
    notifempty
    nocompress
    postrotate
    /usr/bin/docker exec nginx-container-name /bin/sh -c '/usr/sbin/nginx -s reopen > /dev/null 2>/dev/null'       
    endscript
    su docker_nginx root
}

终于成功了。

使用前必须了解参数
在使用它之前我必须了解参数
在使用它之前我必须了解参数