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?
3 Réponses :
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"]
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 .
Si vous insistez pour créer des images séparées, vous pouvez toujours utiliser l ' ARG une commande>. Et la construction de l'image comme ça: ou comme ça docker build --buid-arg file_to_copy=forest.py .
docker build --buid-arg file_to_copy=vegetation.py .
FROM python:3.7-slim-stretch
ARG file_to_copy
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 $file_to_copy .
il construit l'image mais n'exécute pas mes scripts. dit que le fichier exécutable est introuvable dans le chemin. Comment puis-je exécuter le kit?
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