在Kubernetes中运行Debian Docker镜像时遭遇Unix syslog投递错误
解决Kubernetes中运行Docker镜像时的「Unix syslog delivery error」问题
我来帮你排查这个syslog投递错误的问题,先从你的配置里揪出几个关键问题,再给你对应的解决方案:
首先修正Dockerfile里的用户错误
你的Dockerfile里用adduser user1创建了user1用户,但最后又写了USER abc——abc用户根本没被创建啊!这会导致容器启动时切换用户失败,或者用不存在的用户运行,这大概率是引发后续权限问题的根源,先把这个改过来:
# 改成使用已创建的user1用户 FROM debian:jessie EXPOSE 3307 COPY maven /abc/ WORKDIR /abc RUN apt-get update && apt-get install -y openssl libssl-dev libgssapi-krb5-2 syslog-ng-core && adduser user1 && chown -R user1 /abc ENTRYPOINT ["/bin/sh","/abc/run.sh"] USER user1 # 这里修正为已创建的user1
或者如果你确实要使用abc用户,就先创建它:
RUN adduser abc && chown -R abc /abc USER abc
针对「Unix syslog delivery error」的解决方案
这个错误本质是你的应用(mongosqld)尝试向Unix域套接字(比如/dev/log)发送日志,但要么容器里的syslog服务没启动,要么当前用户没有访问套接字的权限,给你两个可行的解决方向:
方向1:推荐——让应用直接输出日志到stdout/stderr(符合K8s最佳实践)
在Kubernetes环境里,最省心的日志收集方式就是让应用把日志直接输出到标准输出/错误,K8s会自动通过容器运行时的日志驱动收集这些日志,不需要依赖容器内的syslog服务。
你可以检查mongosqld的启动参数,大部分工具都支持用--logpath -(-代表标准输出)来指定日志输出位置,修改你的run.sh:
#!/bin/bash chmod 755 /abc/mongosqld # 把日志输出到stdout /abc/mongosqld --schema /abc/rmg.drdl --mongo-uri your-mongo-uri --logpath -
这样就完全绕开了syslog的问题,也更符合云原生应用的日志规范。
方向2:配置容器内的syslog服务(如果一定要用syslog)
如果你必须依赖syslog来收集日志,那需要完成两步:
- 启动syslog-ng服务:你安装了syslog-ng-core,但容器启动时默认不会自动启动它,需要在run.sh里先启动服务:
#!/bin/bash # 先启动syslog-ng,指定配置文件和pid文件 syslog-ng -f /etc/syslog-ng/syslog-ng.conf -p /var/run/syslog-ng.pid # 再启动你的应用 chmod 755 /abc/mongosqld /abc/mongosqld --schema /abc/rmg.drdl --mongo-uri your-mongo-uri
- 确保应用用户有访问syslog套接字的权限:默认情况下
/dev/log的权限可能限制了普通用户访问,你可以在Dockerfile里添加权限调整:
# 方法1:直接开放/dev/log的读写权限给其他用户 RUN chmod o+rw /dev/log # 方法2:把运行应用的用户加入syslog组 RUN usermod -aG syslog user1 # 这里对应你实际使用的用户
内容的提问来源于stack exchange,提问作者dutt
相关产品推荐
相关产品推荐

