前言
nginx的官方镜像都是把日志重定向到标准输出,如果没有特别需求,已经能满足大多数的使用。
这里我主要对官方镜像进行改造,添加logrotate,结合cronJob来实现nginx日志的自动轮转,以方便排查故障问题。
编写Dockerfile构建镜像
1. 编写Dockerfile文件
# Dockerfile文件
cat DockerfileFROM nginx:1.26.2-alpine-slim
RUN apk update && apk add logrotate \&& unlink /var/log/nginx/access.log \&& unlink /var/log/nginx/error.log \&& rm -rf /var/cache/apk/*
COPY nginx /etc/logrotate.d/nginx# logrotate配置文件
cat nginx/var/log/nginx/*.log {su root rootnocompressdailycopytruncatecreatenotifemptyrotate 180missingokdateextpostrotate/bin/kill -HUP `cat /var/run/nginx.pid 2> /dev/null` 2> /dev/null || trueendscript
}
2. 构建双架构镜像
# 如何构建多架构镜像,参考其他文章,这里把主要的命令记录在此docker buildx build --platform=linux/amd64,linux/arm64 -t nginx:1.26.2-alpine_logrotate_root_20241029 -f Dockerfile . --push
K8S部署cronJob资源
这里主要是cronJob资源的yaml文件,其他和常规使用区别不大
apiVersion: batch/v1beta1
kind: CronJob
metadata:name: nginx-logs-rotatenamespace: merry
spec:schedule: "59 23 * * *"concurrencyPolicy: ForbidjobTemplate:spec:template:spec:containers:- name: nginx-logs-rotateimage: nginx:1.26.2-alpine_logrotate_root_20241029command: ["sh", "-c", "/usr/sbin/logrotate -vf /etc/logrotate.d/nginx"]securityContext:runAsUser: 0volumeMounts:- name: nginx-logsmountPath: /var/log/nginxvolumes:- name: nginx-logspersistentVolumeClaim:claimName: nginx-logs-pvcrestartPolicy: OnFailure
注意事项:
1. 部署的nginx pod镜像和cronJob镜像需要一致;
2. 镜像时区要准确;
3. nginx配置文件最好是自定义,这里我使用了root用户运行nginx。