gee*_*rap 18 logging process nginx docker
我正在使用链接到/ dev/stdout的符号链接的nginx方法来查找我想要出现在"docker logs"中的任何日志文件,但是这不起作用.
我在/ etc/crontab中用一个简单的cronjob测试了这个,如果存在一个符号链接(指向/ dev/stdout)它没有写任何东西(据我所知),但如果我删除了符号链接它写入文件.
此外,如果我回显到/ dev/stdout,它会在命令行上回显但是在"docker logs"中找不到它...
问题:这应该有用吗?(它似乎适用于nginx).否则,我如何从"辅助"进程中获取日志以显示在docker日志中.
对于ref:
显示符号链接方法的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
Run Code Online (Sandbox Code Playgroud)
crontab文件:
* * * * * root date >> /var/log/letsencrypt.log
Run Code Online (Sandbox Code Playgroud)
keepalive.sh脚本
#!/bin/bash
# Start cron
rsyslogd
cron
echo "Keepalive script running!"
while true; do
echo 'Sleeping for an hour...'
sleep 10
done
Run Code Online (Sandbox Code Playgroud)
最终结果是cron作业的/ dev / stdout指向了其他设备。
/ proc / self / fd / 1,应该是/ proc / 1 / fd / 1,因为docker只希望一个进程正在运行,这是它监视的唯一stdout。
因此,一旦我修改了符号链接以指向/ proc / 1 / fd / 1,它就应该可以工作,但是apparmor(在主机上)实际上拒绝了请求(并且在回显到/ proc / 1 / fd / 1时出现权限错误),因为默认的docker配置文件(该配置文件会自动生成,但可以使用--security-opts进行修改)。
一旦越过了装甲门,一切都将起作用!
这就是说,在查看了需要在apparmor中进行哪些修改以允许所需的请求之后,我决定使用mkfifo方法,如下所示。
Docker文件
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"
Run Code Online (Sandbox Code Playgroud)
守护程序
#!/bin/bash
# Start cron
cron
tail -qf --follow=name --retry /var/log/stdout /var/log/stderr
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3019 次 |
| 最近记录: |