J'essaie de faire quelque chose de très simple (je pense), je veux créer une image docker et lancer deux scripts différents à partir de la même image dans des conteneurs fonctionnant en parallèle.
Quelque chose d'aussi simple que
Container 1 -> print ("Hello")
Container 2 -> print ('World ")
J'ai fait certaines recherches, mais certaines techniques semblent un peu trop élaborées et d'autres font quelque chose comme
$ docker ps CONTAINER ID IMAGE CREATED STATUS NAMES a7e789711e62 67759a80360c 12 hours ago Up 2 minutes MyContainer1 87ae9c5c3f84 67759a80360c 12 hours ago Up About a minute MyContainer2
ce qui n'est pas ce que je recherche.
I aimerait voir quelque chose comme
CMD ["python", "script.py"] && ["python", "script2.py"]
Mais exécutant deux scripts différents.
Je suis encore assez nouveau dans tout cela, donc si c'est un question idiote, je m'excuse à l'avance et merci à tous de travailler avec moi.
4 Réponses :
Si vous souhaitez utiliser la même image, je vous suggère de définir ENTRYPOINT sur python, puis d'utiliser la commande docker run pour démarrer les conteneurs en fournissant les scripts en tant que CMD comme suit:
Dockerfile: p >
FROM python COPY script2.py script2.py ENTRYPOINT ["python"] CMD ["script2.py"]
Et utilisez la commande docker run comme ceci
FROM python COPY script.py script.py ENTRYPOINT ["python"] CMD ["script.py"]
Ce qui démarrerait deux conteneurs exécutant chacun des scripts séparés
MAIS - J'aime garder les images propres en termes de ne pas avoir de scripts ou de packages supplémentaires qui ne sont pas nécessaires pour que mon service fonctionne, donc dans ce cas, je créerais simplement deux images séparées, chacune ayant l'un des scripts, puis exécutez-les de la même manière.
Example:
docker run -d my_image script.py && docker run -d my_image script2.py
Et la deuxième image:
FROM python ... ENTRYPOINT ["python"]
Et puis les construire simplement comme séparez les images et exécutez de la même manière que précédemment
Essayez ces étapes, cela devrait fonctionner.
Dockerfile
avec le contenu: $ docker run -it --rm --entrypoint python myimage:v1 /script1.py Hello $ $ docker run -it --rm --entrypoint python myimage:v1 /script2.py World $
script1.py
print("World")
script2.py
print("Hello")
docker build -t myimage: v1.
FROM python:3.7-alpine COPY script1.py /script1.py COPY script2.py /script2.py CMD ["/bin/sh"]
REMARQUE: Ici, nous utilisons la même image de docker myimage: v1
et nous changeons simplement le point d'entrée dans chaque docker exécuter la commande.
En savoir plus ici .
J'espère que cela vous aidera.
Vous pouvez le faire facilement en utilisant Docker Compose . Voici un simple fichier docker-compose.yml
juste pour montrer l'idée:
app1_1 | pre-processing app2_1 | post-processing app2_1 | post-processing app2_1 | post-processing app1_1 | pre-processing app2_1 | post-processing app1_1 | pre-processing app2_1 | post-processing ...
Comme vous voyez que les deux services utilisent la même image, alpine code> dans cet exemple, mais diffèrent par les commandes qu'ils exécutent. Exécutez
docker-compose up
et voyez le résultat:
version: '3' services: app1: image: alpine command: > /bin/sh -c 'while true; do echo "pre-processing"; sleep 1; done' app2: image: alpine command: > /bin/sh -c 'while true; do echo "post-processing"; sleep 1; done'
Dans votre cas, il vous suffit de changer l'image en votre image, dites myimage : v1
, et changez les commandes de service afin que la première définition de service contienne la ligne commande: python script1.py
et la seconde commande: python script2.py code >.
Cela m'a beaucoup aidé, c'est exactement ce dont j'avais besoin.
Toute commande placée à la fin de la commande docker run
(ou du champ Docker Compose command:
) remplace le CMD dans le Dockerfile. Je suggérerais de toujours insérer un CMD par défaut utile, mais vous pouvez toujours simplement
docker run --name hello myimage python script.py docker run --name world myimage python script2.py
C'est une idée, pas une instruction, donc ne pas publier comme réponse :) Une option consiste à utiliser des variables d'environnement - puisque vous voulez que les conteneurs exécutent la même image, vous aurez besoin de deux
docker run $ image_name
exécutions. Entre les deux, vous pouvez définir des variables d'environnement différemment, par exempledocker exécute $ image -e RUN_SCRIPT = script1.py
etdocker exécute $ image RUN_SCRIPT = script2.py
. Ensuite, dans dockerfile, vous devrez lui faire reconnaître la var env et exécuter le script correspondant. Enfin, vous pouvez «automatiser» le lancement de ces deux conteneurs ensemble en utilisant docker-compose - mais c'est totalement facultatif.