如何在Docker Container中使用Apache并且不向磁盘写入任何内容(所有日志都记录到STDIO / STDERR)?

时间:2015-08-13 22:43:43

标签: apache docker kubernetes

我在docker容器中运行Apache2并且想要什么都不写入磁盘,将日志写入stdout和stderr。我已经看到了几种不同的方法(Supervisord和stdout / stderr,Apache访问日志到stdout),但这些看起来像黑客。默认情况下没有办法做到这一点吗?

要清楚,我不想拖尾日志,因为这会导致事物被写入容器中的磁盘。

"官方"检查到Docker Hub(https://hub.docker.com/_/httpd/)的版本仍然写入磁盘。

此外,在尝试滚动日志时,我需要做些什么来阻止Apache失败?

另一件事 - 理想情况下,我真的很想在没有其他插件的情况下这样做。 nginx可以做到这一点。

5 个答案:

答案 0 :(得分:5)

根据apache邮件列表,您可以直接写入/ dev / stdio(在类似Unix的系统上),因为它只是一个普通的ol'文件句柄。简单!粘贴...

  

最有效的答案取决于您的操作系统。如果你是   在类似UNIX的系统上提供/ dev / stdout和/ dev / stderr(或   或许/ dev / fd / 1和/ dev / fd / 2)然后使用那些文件名。如果说   不是选项使用管道输出功能。例如,来自我的   配置:

     

CustomLog" | / usr / sbin / rotatelogs -c -f -l -L   /private/var/log/apache2/test-access.log   /private/var/log/apache2/test-access.log.%Y-%m-%d 86400"   krader_custom ErrorLog" | / usr / sbin / rotatelogs -c -f -l -L   /private/var/log/apache2/test-error.log   /private/var/log/apache2/test-error.log.%Y-%m-%d 86400"

     

显然,您想要替换另一个程序   上面示例中的/ usr / sbin / rotatelogs将数据写入到哪里   你希望它去。

https://mail-archives.apache.org/mod_mbox/httpd-users/201508.mbox/%3CCABx2=D-wdd8FYLkHMqiNOKmOaNYb-tAOB-AsSEf2p=ctd6sMdg@mail.gmail.com%3E

答案 1 :(得分:1)

您可以直接将ErrorLog发送到syslog,并且可以将任何CustomLog(访问日志)发送到从stdin读取的任何可执行文件。有日志聚合工具,或者您可以再次使用syslog w /例如的/ usr /斌/记录器。

答案 2 :(得分:1)

您可以尝试使用dockerize工具。有了它,您可以包装httpd-foreground命令并将其日志文件重定向到stdout / stderr(不完全知道httpd日志文件路径,只需根据您的需要调整它们):

CMD ["dockerize", "-stdout", "/var/log/httpd.log", "-stderr", "/var/log/httpd.err", "httpd-foreground"]

除此之外,您可以通过指定 syslog log driver来获取容器stdout / stderr,并将它们重定向到docker主机上的/var/log/syslog日志文件:< / p>

docker run -d --log-driver=syslog ...

答案 3 :(得分:1)

我调整了配置,从httpd的Dockerfile配方开始,他们使用sed调整配置,按如下方式更改ErrorLog和CustomLog:

sed -ri ' \
s!^(\s*CustomLog)\s+\S+!\1 /proc/self/fd/1!g; \
s!^(\s*ErrorLog)\s+\S+!\1 /proc/self/fd/2!g; \
' /usr/local/apache2/conf/httpd.conf \

请参阅https://github.com/docker-library/httpd/blob/master/2.4/Dockerfile(在文件末尾)

答案 4 :(得分:0)

我知道这是一个老问题,但我今天有这个需要。

Alpine 3.6 上,httpd.conf中的以下说明正在运行:

Errorlog /dev/stderr
Transferlog /dev/stdout

我以这种方式将它们添加到我的容器中:

FROM alpine:3.6
RUN apk --update add apache2
RUN sed -i -r 's@Errorlog .*@Errorlog /dev/stderr@i' /etc/apache2/httpd.conf
RUN echo "Transferlog /dev/stdout" >> /etc/apache2/httpd.conf
...