2017-09-20 5 views
3

J'ai un conteneur docker exécutant nginx qui écrit des journaux à /var/log/nginx Logrotate est installé dans le conteneur docker et le fichier de configuration logrotate pour nginx est configuré correctement. Cependant, les journaux ne sont pas automatiquement pivotés par logrotate. Forcer manuellement la rotation du journal 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 cron au feu mais je ne peux pas trouver la raison.Logrotate - les journaux nginx ne tournent pas à l'intérieur du conteneur docker

Voici le Dockerfile pour le conteneur docker fonctionnement 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 docker-composer fichier:

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 me diriger dans la bonne direction pour pourquoi nginx les journaux ne sont pas automatiquement pivotés par logrotate?

EDIT

je peux tracer la cause profonde de ce problème au service cron pas en cours d'exécution sur le récipient. Une solution possible consiste à trouver un moyen de faire en sorte que le conteneur exécute à la fois le service nginx et le service cron.

Répondre

2

Comme indiqué sur l'édition sur ma question le problème était que CMD de nginx:1.11 commençait seulement le processus nginx. Un travail est autour de placer la commande suivante sur mon Dockerfile

CMD service cron start && nginx -g 'daemon off;' 

Cela démarre nginx comme nginx:1.11 commence et ainsi que démarrer 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;'