Problème
Il semble systemd
n'est pas actif ou disponible dans les conteneurs Docker Ubuntu.
Configuration
J'exécute des conteneurs Docker à partir de la base de données ubuntu:16.04
y ubuntu:16.10
des images.
Tests
Si je m'exécute :
systemctl status ssh
dans le 16,04
conteneur
le résultat est l'erreur Failed to connect to bus: No such file or directory
Dans le 16.10
conteneur l'erreur est : bash: systemctl: command not found
.
Si je le fais which systemctl
systemctl se trouve dans le répertoire 16.04
mais pas dans le conteneur 16.10
conteneur.
J'ai repéré que /lib/systemd
existe.
J'ai essayé d'installer systemd avec :
apt-get install systemd libpam-systemd systemd-ui
Puis which systemctl
trouve systemctl dans 16.10
mais systemctl status ssh
donne toujours l'erreur Failed to connect to bus: No such file or directory
Questions
Comment activer systemd et systemctl pour les utiliser dans les images Docker d'Ubuntu ?
Pourquoi systemd n'est pas actif dans les conteneurs Docker d'Ubuntu ? Systemd n'est-il pas utilisé lors de l'instanciation du conteneur ?
Je n'ai pas réussi à trouver de documentation à ce sujet pour les images Ubuntu / Ubuntu Docker, seulement des informations sur la transition d'Ubuntu à partir de Upstart
a systemd
. Existe-t-il une documentation donnant une explication complète ?
0 votes
Si vous voulez un système init entièrement fonctionnel, utilisez une machine virtuelle.
0 votes
Il existe plusieurs propositions pour imiter un système init à PID-1 à l'intérieur d'un conteneur. En gros, il devrait réagir au SIGTERM envoyé par "docker stop" en le distribuant aux autres processus du conteneur. Et il devrait être capable de récolter les zombies des processus d'arrière-plan tués. => Il ne reste plus qu'à choisir une des implémentations qui existent. Certains ne font que porter un véritable "init" en C/C++, d'autres font du scripting autour de signal(3) et waitpid(3) dans un langage de haut niveau - la librairie standard "signal" de Python fonctionne aussi pour cela. (comme indiqué dans mon remplacement docker-systemctl script)
3 votes
Exécuter l'image docker avec
docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro <image>
ysystemctl
fonctionne bien