Si vous souhaitez exécuter régulièrement un projet Python de démarrage en ligne de commande ou le transformer en service et l'exécuter de manière stable dans divers environnements, vous avez toujours la possibilité de le transformer en Docker. Récemment, j'ai décidé comment le faire, alors je vais le partager. Cette fois, j'ai écrit ** système de démarrage en ligne de commande ** parce que je pensais que cela pourrait être un peu différent dans le cas du "système Web". Python est publié en tant que Docker car ** la version que vous souhaitez utiliser ** et ** la version incluse dans le système d'exploitation ** sont en conflit l'une avec l'autre, et l'installation de la bibliothèque est assez difficile (pip n'est pas très intelligent ...). Cela semble assez efficace à faire.
Effectuez la configuration suivante.
.
├── .dockerignore
├── .env
├── .gitignore
├── docker
│ └── data_lab
│ ├── Dockerfile
│ └── docker-compose.yml
├── keys
│ └── gcloud-secret.json
├── requirements.txt
├── ..others..
└── src
├── labs/__init__.py
└── labs/awesomes/hogehoge.py
docker / <nom du conteneur> /
: DIR à créer pour chaque conteneur que vous souhaitez créer. Cette fois, nous allons créer un conteneur appelé data_lab
.src /
: DIR où se trouve le programme Python. C'est l'image qui devient la racine de PYTHONPATH
..dockerignore
: Vous pouvez lister les fichiers que vous souhaitez exclure lorsque vous exécutez la commande COPY
de Docker. Cette fois, il est principalement utilisé pour exclure les fichiers supplémentaires (informations clés et produits inutiles) sous src /
. Cliquez ici pour plus de détails. Il est également utilisé pour réduire la quantité de données contextuelles transférées vers Docker Daemon et l'accélérer (Référence).requirements.txt
: fichier de bibliothèque à installer avec pip ( pip freeze> requirements.txt
)keys /
: emplacement des informations clés. Il n'est pas inclus dans le conteneur, mais est monté dynamiquement depuis le côté hôte lorsque le conteneur est exécuté.requirements.txt
d'abord, exécutez pip, et ** COPY le code source développé (src /
ci-dessous) en dernier **, donc même si vous changez un peu le fichier, la bibliothèque Pas besoin de réexécuter l'installation.src /
** (COPIE uniquement le DIR requis) pour le rendre non affecté par Dockerfile et d'autres mises à jour mineures de fichiers.src /
que vous ne voulez pas inclure dans le conteneur, décrivez-le dans .dockerignore
.Dockerfile
Dockerfile
FROM python:3.5.2
MAINTAINER [email protected]
# Install GCloudSDK
WORKDIR /root
ENV CLOUDSDK_PYTHON=/usr/bin/python2
RUN curl -L -O https://dl.google.com/dl/cloudsdk/channels/rapid/downloads/google-cloud-sdk-121.0.0-linux-x86.tar.gz \
&& tar xzf google-cloud-sdk-121.0.0-linux-x86.tar.gz \
&& ./google-cloud-sdk/install.sh --usage-reporting=true --path-update=true --bash-completion=true --rc-path=/root/.bashrc
ENV PATH=/root/google-cloud-sdk/bin:$PATH
# Install Libraries
RUN mkdir -p /var/lib/data_lab
WORKDIR /var/lib/data_lab
COPY ./requirements.txt ./
RUN pip install -r requirements.txt
# Copy Sources
COPY ./src/ ./src/
build / context
, vous pouvez spécifier le répertoire de contexte au moment de la construction (il semble que vous ne pouvez COPY que sous le répertoire de contexte, donc ** Si vous ne le spécifiez pas,` src / ʻetc. Ne peut pas être COPY ** ).Dockerfile
est le répertoire de contexte ci-dessus.volumes
: spécifie les fichiers et répertoires à monter de l'hôte vers le conteneur lors de l'exécution. Ici, ** informations d'environnement ** (puisque nous utilisons python-dotenv
, copiez le fichier .env
) et ** transmettez les informations clés **.PYTHONPATH
: C'est un gros problème, alors spécifiez-le.docker-compose.yml
version: '2'
services:
data_lab:
image: 9999999999.dkr.ecr.ap-northeast-1.amazonaws.com/data-lab
build:
context: ../..
dockerfile: docker/data_lab/Dockerfile
working_dir: /var/lib/data_lab
volumes:
- ../../.env:/var/lib/data_lab/.env
- ../../keys/:/var/lib/data_lab/keys/
environment:
PYTHONPATH: /var/lib/data_lab/src
Apparemment, dans la version actuelle de Docker (la version que j'utilise ici), il y a un bogue dans docker-compose build
et ** ʻin
.dockerignorene semble pas fonctionner (expérimenté). Vous pouvez l'éviter en utilisant
docker build` à la place.
Référence: https://github.com/docker/docker-py/issues/1117
Donc, si vous voulez utiliser **
pour .dockerignore
,
Normalement
cd docker/data_lab
docker-compose build
Où vous pouvez le faire
cd docker/data_lab
docker build ../.. -f ./Dockerfile -t 9999999999.dkr.ecr.ap-northeast-1.amazonaws.com/data-lab
Vous devrez peut-être faire quelque chose comme ça (c'était une solution de contournement).
Par exemple, créez le script Shell auxiliaire suivant en tant que docker / data_lab / exec.sh
.
exec.sh
#!/bin/sh
cd $(dirname $0)
exec docker-compose run data_lab $@
Vous pouvez maintenant exécuter la commande à l'intérieur du conteneur comme suit:
sh docker/data_lab/exec.sh python src/labs/awesomes/hogehoge.py arg1 arg2 ...
Autrefois, je poussais vers git, je le clonais dans le conteneur, etc., donc c'était beaucoup plus facile. Il est nécessaire de recréer le conteneur chaque fois que le code source est mis à jour, mais comme la différence dans la couche du système de fichiers est petite, je pense qu'il n'y a pas beaucoup de gaspillage.
Immédiatement après la publication de cet article, on m'a fait remarquer que "je devrais utiliser le python officiel: 3.5.2
Docker Image?", Et je l'ai corrigé car il n'y avait aucun problème avec cela. Dans cette image officielle, python
, python3
, etc. sont Python3.5.2, et python2
est Python2.7.9.
Ajout de notes sur Build.
Recommended Posts