web-dev-qa-db-fra.com

Logrotate - Les journaux nginx ne tournent pas à l'intérieur du conteneur de menu fixe

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.

13
dazito

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;'
9
dazito

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
}
1
touchstone