Wenn Sie ein Python-Projekt zum Starten einer Befehlszeile regelmäßig ausführen oder in einen Dienst umwandeln möchten, damit es in verschiedenen Umgebungen stabil ausgeführt werden kann, haben Sie weiterhin die Möglichkeit, es in einen Docker umzuwandeln. Vor kurzem habe ich beschlossen, wie es geht, also werde ich es teilen. Dieses Mal habe ich ** Befehlszeilen-Startsystem ** geschrieben, weil ich dachte, dass es im Fall von "Web-System" etwas anders sein könnte. Python wird als Docker veröffentlicht, da ** die Version, die Sie verwenden möchten ** und ** die im Betriebssystem enthaltene Version ** in Konflikt miteinander stehen und die Installation der Bibliothek ziemlich schwierig ist (pip ist nicht sehr intelligent ...). Scheint ziemlich effektiv zu sein.
Nehmen Sie die folgende Konfiguration vor.
.
├── .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 / <Containername> /
: DIR, das für jeden Container erstellt werden soll, den Sie erstellen möchten. Dieses Mal erstellen wir einen Container namens "data_lab".src /
: DIR, wo sich das Python-Programm befindet. Dies ist das Bild, das zur Wurzel von "PYTHONPATH" wird..dockerignore
: Sie können die Dateien auflisten, die Sie ausschließen möchten, wenn Sie den Docker-Befehl COPY
ausführen. Dieses Mal wird es hauptsächlich verwendet, um zusätzliche Dateien (Schlüsselinformationen und nutzlose Produkte) unter src /
auszuschließen. Klicken Sie hier für Details. Es wird auch verwendet, um die Menge der an Docker Daemon übertragenen Kontextdaten zu reduzieren und zu beschleunigen (Referenz).require.txt
: Bibliotheksdatei, die mit pip installiert werden soll ( pip freeze> require.txt
)keys /
: Speicherort der Schlüsselinformationen. Es ist nicht im Container enthalten, wird jedoch dynamisch von der Hostseite bereitgestellt, wenn der Container ausgeführt wird.require.txt
zuerst, führe pip aus und ** COPY den entwickelten Quellcode (src /
unten) zuletzt **, also selbst wenn du die Datei ein wenig änderst, die Bibliothek Installation muss nicht erneut ausgeführt werden.src /
** (KOPIEREN Sie nur das erforderliche DIR), damit Dockerfile und andere kleinere Dateiaktualisierungen keine Auswirkungen haben.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/
Volumes
: Gibt die Dateien und Verzeichnisse an, die zur Laufzeit vom Host in den Container gemountet werden sollen. Hier ** Umgebungsinformationen ** (da wir python-dotenv
verwenden, kopieren Sie die .env
-Datei) und ** übergeben Sie die Schlüsselinformationen **.PYTHONPATH
: Es ist eine große Sache, also spezifizieren Sie es.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
Anscheinend hat die aktuelle Version von Docker (die Version, die ich hier verwende) einen Fehler in "Docker-Compose Build" und "**" in ".dockerignore" scheint nicht zu funktionieren (erfahren). Sie können dies vermeiden, indem Sie stattdessen "Docker Build" verwenden. Referenz: https://github.com/docker/docker-py/issues/1117
Wenn Sie also "**" für ".dockerignore" verwenden möchten, Normalerweise
cd docker/data_lab
docker-compose build
Wo du es machen kannst
cd docker/data_lab
docker build ../.. -f ./Dockerfile -t 9999999999.dkr.ecr.ap-northeast-1.amazonaws.com/data-lab
Möglicherweise müssen Sie so etwas tun (dies war eine Problemumgehung).
Erstellen Sie beispielsweise das folgende zusätzliche Shell-Skript als "docker / data_lab / exec.sh".
exec.sh
#!/bin/sh
cd $(dirname $0)
exec docker-compose run data_lab $@
Jetzt können Sie den Befehl im Container wie folgt ausführen:
sh docker/data_lab/exec.sh python src/labs/awesomes/hogehoge.py arg1 arg2 ...
Früher habe ich auf git gedrückt, es in den Container geklont und so weiter, so dass es viel einfacher wurde. Es ist notwendig, den Container jedes Mal neu zu erstellen, wenn der Quellcode aktualisiert wird, aber da der Unterschied in der Dateisystemschicht gering ist, denke ich, dass es nicht viel Abfall gibt.
Unmittelbar nach der Veröffentlichung dieses Artikels wurde ich darauf hingewiesen, dass "ich das offizielle Python verwenden sollte: 3.5.2 Docker Image?", Und ich habe es behoben, weil es kein Problem damit gab. In diesem offiziellen Bild sind "Python", "Python3" usw. Python3.5.2 und "Python2" ist Python2.7.9.
Hinweise zu Build hinzugefügt.
Recommended Posts