194 votes

Puis-je exécuter plusieurs programmes dans un conteneur Docker ?

J'essaie d'appréhender Docker du point de vue du déploiement d'une application destinée à être exécutée sur le bureau de l'utilisateur. Mon application est simplement une application web flask et une base de données mongo. Normalement, je devrais installer les deux dans une VM et transférer un port hôte à l'application web invitée. J'aimerais essayer Docker mais je ne suis pas sûr de savoir comment utiliser plus d'un programme. La documentation indique qu'il ne peut y avoir qu'un seul point d'entrée, alors comment puis-je avoir Mongo et mon application Flask ? Ou bien doivent-ils être dans des conteneurs séparés, auquel cas comment peuvent-ils communiquer entre eux et comment cela facilite-t-il la distribution de l'application ?

2 votes

Tout à fait d'accord : je me demande pourquoi les dockers étaient si populaires (processus unique ?) - mais voyons ce que les réponses nous disent

6voto

OzNetNerd Points 171

Docker fournit un quelques exemples sur la façon de le faire. L'option la plus légère est de :

Mettez toutes vos commandes dans un script enveloppant, avec des tests. et de débogage. Exécutez le script enveloppant comme votre CMD . Il s'agit d'un un exemple très naïf. D'abord, le wrapper script :

#!/bin/bash

# Start the first process
./my_first_process -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_first_process: $status"
  exit $status
fi

# Start the second process
./my_second_process -D
status=$?
if [ $status -ne 0 ]; then
  echo "Failed to start my_second_process: $status"
  exit $status
fi

# Naive check runs checks once a minute to see if either of the processes exited.
# This illustrates part of the heavy lifting you need to do if you want to run
# more than one service in a container. The container will exit with an error
# if it detects that either of the processes has exited.
# Otherwise it will loop forever, waking up every 60 seconds

while /bin/true; do
  ps aux |grep my_first_process |grep -q -v grep
  PROCESS_1_STATUS=$?
  ps aux |grep my_second_process |grep -q -v grep
  PROCESS_2_STATUS=$?
  # If the greps above find anything, they will exit with 0 status
  # If they are not both 0, then something is wrong
  if [ $PROCESS_1_STATUS -ne 0 -o $PROCESS_2_STATUS -ne 0 ]; then
    echo "One of the processes has already exited."
    exit -1
  fi
  sleep 60
done

Ensuite, le Dockerfile :

FROM ubuntu:latest
COPY my_first_process my_first_process
COPY my_second_process my_second_process
COPY my_wrapper_script.sh my_wrapper_script.sh
CMD ./my_wrapper_script.sh

3voto

ben schwartz Points 1027

Je suis d'accord avec les autres réponses que l'utilisation de deux conteneurs est préférable, mais si vous avez à cœur de regrouper plusieurs services dans un seul conteneur, vous pouvez utiliser quelque chose comme supervisord.

sur Mal de hanche Par exemple, le fichier Dockerfile inclus exécute supervisord, et le fichier supervisord.conf spécifie que hipache et redis-server doivent être exécutés.

1voto

Raphael Points 1262

Si un script dédié vous semble trop lourd, vous pouvez lancer des processus séparés explicitement avec sh -c . Par exemple :

CMD sh -c 'mini_httpd -C /my/config -D &' \
 && ./content_computing_loop

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