Pourquoi ne puis-je pas utiliser Docker CMD plusieurs fois pour exécuter plusieurs services?

J’ai construit une image de base à partir de Dockerfile nommé centos + ssh. Dans le fichier Dockerfile de centos + ssh, j’utilise CMD pour exécuter le service ssh.

Ensuite, je veux construire un autre service image nommé rabbitmq, le fichier Docker:

FROM centos+ssh EXPOSE 22 EXPOSE 4149 CMD /opt/mq/sbin/rabbitmq-server start 

Pour démarrer le conteneur rabbitmq , exécuter :

 docker run -d -p 222:22 -p 4149:4149 rabbitmq 

mais le service ssh ne fonctionne pas, il semble que le Dockerfile CMD de rabbitmq remplace le CMD de centos.

  1. Comment CMD fonctionne-t-il dans l’image docker?
  2. Si je veux exécuter plusieurs services, comment faire? Utiliser un superviseur?

Même si CMD est écrit dans le Dockerfile, il s’agit vraiment d’informations d’exécution. Tout comme EXPOSE, mais contrairement à RUN et ADD. Par cela, je veux dire que vous pouvez le remplacer plus tard, dans un Dockerfile étendu, ou simple dans votre commande run, ce que vous vivez. En tout temps, il ne peut y avoir qu’un seul CMD.

Si vous voulez exécuter plusieurs services, j’utiliserais en effet un superviseur. Vous pouvez créer un fichier de configuration de superviseur pour chaque service, les append dans un répertoire et exécuter le superviseur avec supervisord -c /etc/supervisor pour pointer vers un fichier de configuration de superviseur qui charge tous vos services et ressemble à

 [supervisord] nodaemon=true [include] files = /etc/supervisor/conf.d/*.conf 

Si vous souhaitez plus de détails, j’ai écrit un blog sur ce sujet ici: http://blog.sortingfork.com/2014/03/11/using-supervisor-with-docker-to-manage-processes-supporting-image- inheritance/

Vous avez raison, le deuxième fichier Docker va remplacer la commande CMD du premier. Docker exécutera toujours une seule commande, pas plus. Ainsi, à la fin de votre fichier Docker, vous pouvez spécifier une commande à exécuter. Pas plus.

Mais vous pouvez exécuter les deux commandes sur une seule ligne:

 FROM centos+ssh EXPOSE 22 EXPOSE 4149 CMD service sshd start && /opt/mq/sbin/rabbitmq-server start 

Ce que vous pouvez également faire pour rendre votre fichier Dockerfile un peu plus propre, vous pouvez mettre vos commandes CMD dans un fichier supplémentaire:

 FROM centos+ssh EXPOSE 22 EXPOSE 4149 CMD sh /home/centos/all_your_commands.sh 

Et un fichier comme celui-ci:

 service sshd start & /opt/mq/sbin/rabbitmq-server start 

Bien que je respecte la réponse de qkrijger expliquant comment vous pouvez contourner ce problème, je pense qu’il y a beaucoup plus à apprendre sur ce qui se passe ici …

Pour répondre à votre question de ” pourquoi ” … je pense qu’il serait utile que vous compreniez comment fonctionne la commande docker stop et que tous les processus doivent être arrêtés proprement pour éviter les problèmes lorsque vous essayez de les redémarrer (corruption de fichiers, etc.) .

Problème: et si docker avait démarré SSH depuis sa commande et lancé RabbitMQ à partir de votre fichier Docker? ” La commande docker stop tente d’arrêter tout d’abord un conteneur en cours d’envoi en envoyant un signal SIGTERM au processus racine (PID 1) du conteneur. ” Sera-ce SSH ou Rabbit ?? “Selon le modèle de processus Unix, le processus init – PID 1 – hérite de tous les processus enfants orphelins et doit les récupérer. La plupart des conteneurs Docker n’ont pas de processus d’initialisation qui effectue correctement cette opération. zombie processus au fil du temps “.

Réponse: Docker prend simplement ce dernier CMD comme celui qui sera lancé en tant que processus racine avec le PID 1 et obtiendra le SIGTERM de l’ docker stop du docker stop .

Solution suggérée: Vous devez utiliser (ou créer) une image de base spécialement conçue pour exécuter plusieurs services, telle que phusion / baseimage

Il est important de noter que tini existe exactement pour cette raison, et à partir de Docker 1.13 et plus, tini fait officiellement partie de Docker, ce qui nous indique que l’exécution de plusieurs processus dans Docker EST VALIDE . être plus compétent en ce qui concerne Docker, et insiste sur le fait que vous êtes absurde en pensant à cela, sachez que vous ne l’êtes pas. Il existe des situations parfaitement valables pour le faire.

Bon à savoir: