gpt4 book ai didi

从多进程 docker 容器记录

转载 作者:IT老高 更新时间:2023-10-28 12:41:13 28 4
gpt4 key购买 nike

我正在使用 nginx 符号链接(symbolic link)方法来链接到/dev/stdout 来处理我想出现在“docker logs”中的任何日志文件,但这不起作用。

我已经在/etc/crontab 中使用一个简单的 cronjob 对此进行了测试,如果存在符号链接(symbolic link)(指向/dev/stdout)它不会写任何东西(据我所知),但如果我删除符号链接(symbolic link)并写入文件。

此外,如果我回显到/dev/stdout,它会在命令行上回显,但在“docker logs”中找不到...

问题:这应该有效吗? (它似乎与 nginx 一起工作)。否则,我将如何从“辅助”进程中获取日志以显示在 docker 日志中。

供引用:

显示符号链接(symbolic link)方法的 Nginx Dockerfile:https://github.com/nginxinc/docker-nginx/blob/a8b6da8425c4a41a5dedb1fb52e429232a55ad41/Dockerfile

为此创建了一份官方错误报告:https://github.com/docker/docker/issues/19616

我的 Dockerfile:

FROM ubuntu:trusty
#FROM quay.io/letsencrypt/letsencrypt:latest # For testing

ENV v="Fri Jan 22 10:08:39 EST 2016"

# Setup the cronjob
ADD crontab /etc/crontab
RUN chmod 600 /etc/crontab

# Setup letsencrypt logs
RUN ln -sf /dev/stdout /var/log/letsencrypt.log
# Setup cron logs
RUN ln -sf /dev/stdout /var/log/cron.log
RUN ln -sf /dev/stdout /var/log/syslog

# Setup keepalive script
ADD keepalive.sh /usr/bin/keepalive.sh
RUN chmod +x /usr/bin/keepalive.sh

ENTRYPOINT /usr/bin/keepalive.sh

crontab 文件:

* * * * * root date >> /var/log/letsencrypt.log

keepalive.sh 脚本

#!/bin/bash

# Start cron
rsyslogd
cron

echo "Keepalive script running!"

while true; do

echo 'Sleeping for an hour...'
sleep 10

done

最佳答案

最终结果是 cron 作业的/dev/stdout 指向了不同的设备。

/proc/self/fd/1 应该是/proc/1/fd/1 因为 docker 只希望一个进程运行,这是它监控的唯一标准输出。

因此,一旦我将符号链接(symbolic link)修改为指向/proc/1/fd/1 它应该可以工作,但是 apparmor(在主机上)实际上拒绝了请求(并且在回显到/proc/1/时出现权限错误fd/1) 因为默认的 docker 配置文件(它是自动生成的,但可以使用 --security-opts 修改)。

一旦跨过 apparmor 障碍,一切都会奏效!

这就是说,在查看了在 apparmor 中需要修改什么以允许所需的请求之后,我决定使用 mkfifo 方法,如下所示。

Dockerfile

FROM ubuntu:latest

ENV v="RAND-4123"

# Run the wrapper script (to keep the container alive)
ADD daemon.sh /usr/bin/daemon.sh
RUN chmod +x /usr/bin/daemon.sh

# Create the pseudo log file to point to stdout
RUN mkfifo /var/log/stdout
RUN mkfifo /var/log/stderr

# Create a cronjob to echo into the logfile just created
RUN echo '* * * * * root date 2>/var/log/stderr 1>/var/log/stdout' > /etc/crontab

CMD "/usr/bin/daemon.sh"

daemon.sh

#!/bin/bash

# Start cron
cron

tail -qf --follow=name --retry /var/log/stdout /var/log/stderr

关于从多进程 docker 容器记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34950465/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com