2
votes

Comment exécuter différents scripts Python dans des conteneurs parallèles à partir de la même image

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.


1 commentaires

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 exemple docker exécute $ image -e RUN_SCRIPT = script1.py et docker 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.


4 Réponses :


1
votes

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


0 commentaires

1
votes

Essayez ces étapes, cela devrait fonctionner.

  • Créez un 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
$
  • Dans script1.py
print("World")
  • Dans script2.py
print("Hello")
  • Créer une image docker docker build -t myimage: v1.
  • Exécutez les conteneurs
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.


0 commentaires

2
votes

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 >.


1 commentaires

Cela m'a beaucoup aidé, c'est exactement ce dont j'avais besoin.



1
votes

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


0 commentaires