web-dev-qa-db-fra.com

Comment connaître la raison pour laquelle un conteneur docker se ferme?

J'ai un conteneur Docker qui s'exécute dans un hôte de 1G RAM (il existe également d'autres conteneurs s'exécutant dans le même hôte). L'application de ce conteneur Docker décodera certaines images, qui risquent de consommer beaucoup de mémoire.

De temps en temps, ce conteneur va sortir. Je doute que cela soit dû à un manque de mémoire, mais pas très sûr. J'ai besoin d'une méthode pour trouver la cause. Alors, y a-t-il un moyen de savoir ce qui s'est passé pour la mort de ce conteneur?

74
Li Bin

D'autres ont mentionné docker logs $container_id pour afficher le résultat de l'application. Ce serait toujours ma première chose à vérifier.

Ensuite, vous pouvez exécuter un docker inspect $container_id pour afficher les détails de l’état, par exemple:

    "State": {
        "Status": "exited",
        "Running": false,
        "Paused": false,
        "Restarting": false,
        "OOMKilled": false,
        "Dead": false,
        "Pid": 0,
        "ExitCode": 2,
        "Error": "",
        "StartedAt": "2016-06-28T21:26:53.477229071Z",
        "FinishedAt": "2016-06-28T21:26:53.478066987Z"
    },

La ligne importante là-bas est "OOMKilled", ce qui sera vrai si vous dépassez les limites de mémoire du conteneur et si Docker tue votre application. Vous pouvez également consulter le code de sortie pour voir s'il identifie une cause de sortie par votre application.

Notez que cela indique uniquement si docker tue lui-même votre processus et nécessite que vous ayez défini une limite de mémoire sur votre conteneur. En dehors de docker, le noyau Linux peut interrompre votre processus si l’hôte lui-même manque de mémoire. Linux écrit souvent dans un journal dans/var/log lorsque cela se produit. Avec Docker Desktop sous Windows et Mac, vous pouvez ajuster la mémoire allouée à Linux VM intégré dans les paramètres du menu fixe.

92
BMitch

Vous pouvez savoir si le processus à l'intérieur du conteneur était OOMkilled en lisant les journaux. OOMkills étant initié par le noyau, chaque fois que cela se produit, il y a un tas de lignes dans /var/log/kern.log, par exemple:

python invoked oom-killer: gfp_mask=0x14000c0(GFP_KERNEL), nodemask=(null), order=0, oom_score_adj=995
oom_kill_process+0x22e/0x450
Memory cgroup out of memory: Kill process 31204 (python) score 1994 or sacrifice child
Killed process 31204 (python) total-vm:7350860kB, anon-rss:4182920kB, file-rss:2356kB, shmem-rss:0kB
2
styrofoam fly