J'ai un conteneur de menu fixe qui exécute nginx et écrit les journaux dans /var/log/nginx
Logrotate est installé dans le conteneur de menu fixe et le fichier de configuration logrotate de nginx est correctement configuré. Néanmoins, les journaux ne sont pas automatiquement pivotés par logrotate. Forcer manuellement la rotation des journaux pour faire pivoter les journaux via logrotate -f /path/to/conf-file
fonctionne comme prévu.
Ma conclusion est que quelque chose ne déclenche pas le feu mais que je ne trouve pas la raison.
Voici le fichier Dockerfile du conteneur docker exécutant nginx:
FROM nginx:1.11
# Remove sym links from nginx image
RUN rm /var/log/nginx/access.log
RUN rm /var/log/nginx/error.log
# Install logrotate
RUN apt-get update && apt-get -y install logrotate
# Copy MyApp nginx config
COPY config/nginx.conf /etc/nginx/nginx.conf
#Copy logrotate nginx configuration
COPY config/logrotate.d/nginx /etc/logrotate.d/
Et le fichier docker-compose :
version: '2'
services:
nginx:
build: ./build
restart: always
ports:
- "80:80"
- "443:443"
volumes:
- ./auth:/etc/nginx/auth
- ./certs:/etc/nginx/certs
- ./conf:/etc/nginx/conf
- ./sites-enabled:/etc/nginx/sites-enabled
- ./web:/etc/nginx/web
- nginx_logs:/var/log/nginx
logging:
driver: "json-file"
options:
max-size: "100m"
max-file: "1"
volumes:
nginx_logs:
networks:
default:
external:
name: my-network
Voici le contenu de: /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
dateext
missingok
rotate 30
compress
delaycompress
notifempty
create 0640 www-data adm
sharedscripts
prerotate
if [ -d /etc/logrotate.d/httpd-prerotate ]; then \
run-parts /etc/logrotate.d/httpd-prerotate; \
fi \
endscript
postrotate
[ -s /run/nginx.pid ] && kill -USR1 `cat /run/nginx.pid`
endscript
}
Contenu de /etc/cron.daily/logrotate
#!/bin/sh
test -x /usr/sbin/logrotate || exit 0
/usr/sbin/logrotate /etc/logrotate.conf
Contenu de /etc/logrotate.conf
# see "man logrotate" for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# packages drop log rotation information into this directory
include /etc/logrotate.d
# no packages own wtmp, or btmp -- we'll rotate them here
/var/log/wtmp {
missingok
monthly
create 0664 root utmp
rotate 1
}
/var/log/btmp {
missingok
monthly
create 0660 root utmp
rotate 1
}
# system-specific logs may be configured here
Quelqu'un peut-il m'indiquer dans le bon sens pourquoi les journaux nginx ne sont pas automatiquement pivotés par logrotate?
MODIFIER
Je peux retracer la cause première de ce problème en empêchant le service cron de s'exécuter sur le conteneur. Une solution possible consiste à trouver un moyen de faire en sorte que le conteneur exécute simultanément les services nginx et cron.
Comme indiqué dans la modification de ma question, le problème était que CMD
de nginx:1.11
commençait seulement le processus nginx
. Une solution consiste à placer la commande suivante sur mon fichier Docker
CMD service cron start && nginx -g 'daemon off;'
Cela démarrera nginx lorsque nginx:1.11
le lancera et lancera le service cron.
Le Dockerfile ressemblerait à quelque chose comme:
FROM nginx:1.11
# Remove sym links from nginx image
RUN rm /var/log/nginx/access.log
RUN rm /var/log/nginx/error.log
# Install logrotate
RUN apt-get update && apt-get -y install logrotate
# Copy MyApp nginx config
COPY config/nginx.conf /etc/nginx/nginx.conf
#Copy logrotate nginx configuration
COPY config/logrotate.d/nginx /etc/logrotate.d/
# Start nginx and cron as a service
CMD service cron start && nginx -g 'daemon off;'
j'ai trouvé une méthode de ce lien , son idée de base est d'utiliser logrotate
dehors, et conf est comme ci-dessous:
$ Sudo vi /etc/logrotate.d/test
/home/test/logs/*log {
rotate 90
missingok
ifempty
sharedscripts
compress
postrotate
docker exec -it nginx-test systemctl reload nginx > /dev/null 2>/dev/null || true
endscript
}