1
votes

Comment exécuter des fichiers python conservés dans des dossiers séparés à partir d'un Dockerfile?

J'ai un fichier docker qui ressemble à ceci:

FROM python:3.7-slim-stretch

ENV PIP pip

RUN \
    $PIP install --upgrade pip && \
    $PIP install scikit-learn && \
    $PIP install scikit-image && \
    $PIP install rasterio && \  
    $PIP install geopandas && \ 
    $PIP install matplotlib

COPY sentools sentools
COPY data data
COPY vegetation.py .

Maintenant, dans mon projet, j'ai deux fichiers python végétation et forêt. j'ai gardé chacun d'eux dans des dossiers séparés. Comment puis-je créer des images Docker distinctes pour les deux fichiers python et exécuter les conteneurs séparément?


0 commentaires

3 Réponses :


2
votes

Si le code de base est le même et que seul le conteneur est censé fonctionner avec différents scripts Python, alors je suggérerai d'utiliser un seul Docker et vous ne vous soucierez pas de la gestion de deux images de docker.

Définissez végétation.py par défaut, lorsque le conteneur est en place sans passer ENV, il exécutera végétation.py et si le remplacement ENV FILE_TO_RUN pendant l'exécution, le le fichier spécifié sera exécuté.

FROM python:3.7-alpine3.9 
# assign some default script name to args
ARG APP="default_script.py"
ENV APP=$APP
COPY vegetation.py /vegetation.py
COPY forest.py /forest.py
CMD ["sh", "-c", "python /$APP"]

Maintenant, si vous voulez exécuter forest.py , vous pouvez simplement passer le fichier de chemin à ENV.

docker run --rm -it app_forest

ou

docker build --build-arg APP="forest.py" -t app_forest .

updated:

Vous pouvez gérer avec args + env dans votre image de docker.

docker build --build-arg APP="vegetation.py" -t app_vegetation .

Maintenant, construisez avec les ARG

FROM python:3.7-alpine3.9 
ARG APP="default_script.py"
ENV APP=$APP
COPY $APP /$APP
CMD ["sh", "-c", "python /$APP"]

ou

docker run -it -e FILE_TO_RUN="/anyfile_to_run.py" --rm my_image

Maintenant bon à exécuter

docker run -it -e FILE_TO_RUN="/forest.py" --rm my_image

copiez les deux

FROM python:3.7-alpine3.9 
ENV FILE_TO_RUN="/vegetation.py"
COPY vegetation.py /vegetation.py
CMD ["sh", "-c", "python $FILE_TO_RUN"]


6 commentaires

malheureusement je ne peux pas utiliser de variables d'environnement dans ce projet mais une bonne solution


cela a fonctionné pour moi mais que faire si je dois utiliser un script python par défaut pour ENV au cas où il ne serait pas défini au moment de la construction. Comment puis je faire ça? En plus de tout ce travail


ajoutée. vous pouvez attribuer un nom de script par défaut aux args.


`` `# attribuez un nom de script par défaut à args ARG APP =" default_script.py "` `` `donc si vous avez manqué à la construction, default_script.py sera choisi


cela génère une erreur ARG nécessite exactement 1 argument


continuons cette discussion dans le chat .




0
votes

Lorsque vous démarrez un conteneur Docker, vous pouvez spécifier la commande à exécuter à la fin de la commande docker run . Vous pouvez donc créer une seule image contenant les deux scripts et choisir celui qui s'exécute lorsque vous démarrez le conteneur.

Les scripts doivent être "normalement" exécutables: ils doivent avoir le bit d'autorisation exécutable défini, et ils doivent commencer par une ligne comme

$ tail -2 Dockerfile.vegetation
COPY vegetation.py ./
CMD ["./vegetation.py"]
$ docker build -t vegetation -f Dockerfile.vegetation .
$ docker run --rm vegetation

et vous devriez pouvoir exécuter localement (en dehors de Docker)

docker build -t trees .
docker run --rm trees ./vegetation.py
docker run --rm trees ./forest.py

Une fois que vous avez terminé, vous pouvez copier le contenu dans une image Docker

FROM python:3.7-slim-stretch
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY sentools sentools
COPY data data
COPY vegetation.py forest.py .
CMD ["./vegetation.py"]

Ensuite, vous pouvez créer et exécuter cette image avec l'un ou l'autre script. p >

. some_virtual_environment/bin/activate
./vegetation.py

Si vous souhaitez en fait qu'il s'agisse de deux images distinctes, vous pouvez créer deux fichiers Docker distincts qui ne diffèrent que par leur COPY et CMD code> et utilisez l'option docker build -f pour choisir celle à utiliser.

#!/usr/bin/env python3


0 commentaires