84 votes

Comment utiliser le paramètre --init dans l'exécution de docker

Il y a --init y --init-path options pour docker run mais la façon de l'utiliser n'est pas claire.

Au début, je pensais que c'était quelque chose comme unité de base mais inclus dans le noyau de docker (en quelque sorte "natif"). Mais --init demandes clés --init-path doit également être défini, en pointant vers "docker-init binary", et ne donne aucun indice sur la façon de le prendre. Google ne dit rien sur "docker-init".

Ok, peut-être que je suis censé utiliser 'yelp/dumb-init' ou 'phusion/baseimage-docker', mais ces solutions ne semblent pas utiliser docker run 's --init option.

Je suis donc curieux de savoir où je dois prendre ce "binaire docker-init" pour définir l'option --init-path à ?

0 votes

Quelle version utilisez-vous ? Je ne rencontre pas ce problème avec la dernière version.

0 votes

Docker version 17.03.1-ce, build c6d412e

1 votes

Les lecteurs de cette discussion peuvent trouver la documentation relative à docker run y --init utile : docs.docker.com/engine/reference/run/#specify-an-init-process

111voto

Matt Points 8168

En spécifiant la nouvelle option docker --init dans la commande d'exécution, on définit ENTRYPOINT comme suit tini et lui passe le CMD ou ce que vous spécifiez sur la ligne de commande.

Par exemple, sans init, CMD devient pid 1. Dans ce cas, /bin/bash

docker run -ti --rm ubuntu:16.04 /bin/bash
root@d740f7360840:/# ps -fA
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  1 03:30 ?        00:00:00 /bin/bash
root        11     1  0 03:30 ?        00:00:00 ps -fA

Avec --init, tini (/dev/init) devient pid 1

docker run -ti --init --rm ubuntu:16.04 /bin/bash
root@5b5fe6ee71b5:/# ps -fA
UID        PID  PPID  C STIME TTY          TIME CMD
root         1     0  1 03:30 ?        00:00:00 /dev/init -- /bin/bash
root         7     1  0 03:30 ?        00:00:00 /bin/bash
root        12     7  0 03:30 ?        00:00:00 ps -fA

tini est un processus init de première classe qui peut être exécuté correctement en tant que pid 1. Un processus pid 1 doit récupérer les processus enfants correctement, si ce n'est pas le cas, de mauvaises choses se produisent, comme la fuite de ressources et l'apparition de zombies.

C'est ce que vous voulez pour les applications qui forkent et n'ont pas été écrites avec le fauchage des enfants à l'esprit, car normalement ils laisseraient cela au système init. Un exemple classique est celui des applications java Jenkins.

9 votes

De très bons points ici ! Je recommanderais également à tout le monde de jeter un coup d'œil sur ce post sur tini

0 votes

Donc, j'ai une image avec une application python installée qui a plusieurs commandes et processus à exécuter, webserver, monitor, worker J'ai fait un point d'entrée script qui fait un peu de configuration pour chacun afin que je puisse exécuter 3 versions de l'image et passer seulement webserver, monitor, ou worker comme commande. Le point d'entrée gère un peu d'initialisation pour le serveur web qui diffère des autres. J'obtiens cependant quelques processus zombies si un travailleur gunicorn meurt ; je me suis demandé si je pouvais lancer dans --init et garder le point d'entrée et la commande tels quels.

1 votes

@dlamblin cela semble être possible ; voir la documentation de Tini ici : github.com/krallin/tini#existing-entrypoint

11voto

Mike Points 546

J'ai trouvé ceci dans documentation :

Vous pouvez utiliser le drapeau --init pour indiquer qu'un processus d'init doit être utilisé comme PID 1 dans le conteneur. La spécification d'un processus init garantit les responsabilités habituelles d'un système init, telles que la capture des processus sont exécutées à l'intérieur du conteneur créé. Le processus d'init par défaut processus d'init utilisé est le premier exécutable docker-init trouvé dans le chemin chemin système du processus du démon Docker. Ce binaire docker-init, inclus dans l'installation par défaut, est soutenu par tini .

Je n'ai pas pu trouver docker-init sur une installation Docker de macOS, mais sous Linux, c'est ici :

/usr/bin/docker-init

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X