89 votes

Comment la politique "restart: always" fonctionne-t-elle dans docker-compose ?

J'ai un fichier docker-compose avec PostgreSQL et mon application, comme ceci :

version: '3'

services:
  postgresql:
    image: postgres:9.6.6
    ports:
      - 9932:5432
    expose:
      - "5432"
    environment:
      - POSTGRES_PASSWORD=pass
    restart: always
    volumes:
      - /data:/var/lib/postgresql/data

  myapp:
    image: myapp
    links:
      - postgresql
    depends_on:
      - "postgresql"
    restart: always
    ports:
      - "5000:5000"

Le problème est que la politique restart: always ne semble pas fonctionner lorsque je tue le conteneur (simulant un crash de l'application en utilisant docker kill) et docker-compose ne redémarre pas mon conteneur, même si le code de sortie est 137. Je observe le même comportement lorsque j'utilise la politique restart: on-failure. Les versions 2 et 3 de docker-compose se comportent de la même manière. Mon système est Ubuntu Server 16.04 x64.

Mes questions sont :

  1. Pourquoi docker-compose ne redémarre pas un conteneur crashé (tué) ?
  2. Comment vérifier si la politique de redémarrage fonctionne ?

13 votes

J'étais là plusieurs fois, mais comme vous pouvez le voir, la documentation n'est pas robuste et il n'y a aucune explication sur le fonctionnement de cette fonctionnalité, c'est pourquoi j'ai posé une question - J'aimerais voir une réponse de quelqu'un ayant une expérience pratique dans ce domaine.

55voto

Miguel A. C. Points 1131

Lorsque vous utilisez docker kill, c'est le comportement attendu car Docker ne redémarre pas le conteneur : "Si vous arrêtez manuellement un conteneur, sa politique de redémarrage est ignorée jusqu'à ce que le démon Docker redémarre ou que le conteneur soit redémarré manuellement. Il s'agit d'une autre tentative d'éviter une boucle de redémarrage" (référence)

Si vous utilisez docker stop ou docker kill, vous arrêtez manuellement le conteneur. Vous pouvez effectuer des tests sur les politiques de redémarrage : redémarrer le démon Docker, redémarrer votre serveur, utiliser une commande à l'intérieur d'un conteneur et exécuter une sortie...

Par exemple, si je tue mon conteneur déployé avec une politique de redémarrage, je vois qu'il s'est arrêté avec le code 137 mais il n'est pas redémarré selon docker ps -a, il reste arrêté:

[root@andromeda ~]# docker ps --all
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                        PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   Il y a 3 minutes       Arrêté (137) Il y a 34 secondes                       keepalive_redis_1

Mais si je redémarre le démon...

[root@andromeda ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
819d1264c30a        redis:alpine        "docker-entrypoint..."   Il y a 30 minutes      En cours d'exécution depuis 2 secondes        6379/tcp            keepalive_redis_1

Le conteneur qui était configuré avec une politique de redémarrage redémarre à nouveau, ce qui est ce que la documentation mentionne, donc docker kill n'est pas la manière dont vous devriez tester la politique de redémarrage car il est supposé que vous avez délibérément arrêté le conteneur et Docker veut avoir un moyen d'éviter les boucles de redémarrage, si vous le tuez, vous voulez vraiment le tuer.

J'ai trouvé les liens suivants précieux qui montrent le même comportement dans différentes versions (donc ce n'est pas un bogue mais le comportement attendu) :

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X