Wenn Sie mit Docker vertraut sind, wissen Sie wahrscheinlich, dass Sie mit Dockerfile ein benutzerdefiniertes Docker-Image erstellen können. Ich habe ausführlich darüber geschrieben.
So erstellen Sie ein benutzerdefiniertes Docker-Image mit Dockerfile [sehr einfach]Die wahre Stärke von Docker liegt darin, das Basis-Docker-Image an Ihre Anforderungen anzupassen. Damit können Sie einfach und schnell eine benutzerdefinierte Linux-Umgebung bereitstellen, indem Sie einen Container von diesem benutzerdefinierten Docker-Image ausführen. Linux-HandbuchAvimanyu BandyopadhyayIn diesem Tutorial zeige ich Ihnen, wie Sie der gleichen Idee folgen, aber nur für Python-Anwendungen. Dies wird sowohl für Benutzer als auch für Entwickler nützlich sein.
Ich werde ein minimales Python-Image verwenden. Nachdem Sie dieses Image geändert und überarbeitet haben, müssen Sie sich keine Gedanken mehr über die Installation Ihrer Python-Anwendung auf verschiedenen Betriebssystemen machen. Sie können Ihre Python-Anwendung sofort jedes Mal mit Docker ausführen. Sie können sich also von diesen hostbasierten Installationsproblemen verabschieden!
Erstellen eines Docker-Images für Ihre Python-Anwendung
Ich werde Miniconda hier verwenden. Miniconda ist ein kostenloses minimales Installationsprogramm für Conda und bietet Ihnen eine kleine Bootstrap-Version von Anaconda mit nur den grundlegenden Anforderungen, die Sie zum Ausführen von Python-Anwendungen benötigen.
Warum Miniconda?
Dafür gibt es mehr als einen Grund:
Wenn Sie Miniconda auf einem Host installieren, verwenden Sie eigentlich nicht die Python-Version, die vom Paketmanager des Betriebssystems bereitgestellt wird. Miniconda wird an einem separaten Ort mit einer eigenen Python-Umgebung installiert. Dies bietet Ihnen also eine zusätzliche Isolationsebene, wenn Sie dies in einem Docker-Container tun.
Durch den obigen Punkt erhältst du noch einen weiteren Vorteil:Da du conda
verwendest die Miniconda installiert hat, können Sie mit diesem Tool die relevante Python-Version Ihrer Anwendung nach Bedarf ändern. Dies ist eine große Hilfe für Entwickler von Anwendungen, die beispielsweise auf verschiedenen Versionen von Python 3 basieren:Das können auch 3.6, 3.7, 3.8, 3.9 oder frühere Versionen sein.
Wenn Sie beispielsweise standardmäßig Python 3.9 ausführen, Ihre Python-Anwendung jedoch aufgrund relevanter Abhängigkeiten Python 3.7 erfordert, was würden Sie tun?
Hier ist conda
kann dir helfen. Damit können Sie conda install python=3.7
ausführen um die erforderliche Python-Version zu ändern, indem Sie sie mit allen erforderlichen Abhängigkeiten installieren.
- Mit Miniconda können Sie sowohl Python 2- als auch Python 3-Anwendungen installieren. Obwohl Python 2 offiziell tot ist, können Sie immer noch ältere Anwendungen auf dieser Umgebung testen, ohne Ihren neuen Python 3-Port mit 2to3 prüfen zu müssen.
- Es gibt auch viele Anwendungsfälle, in denen eine Python-Anwendung, die auf Miniconda ausgeführt wird, hostseitige Nicht-Python-Abhängigkeiten sucht (z. B.
g++
). Dann wird die kombinierte Leistung von Miniconda und Docker zu einer großartigen Lösung! - Habe ich vergessen zu erwähnen, dass Sie mit
conda
auch Ihre eigenen Python-Anwendungsumgebungen erstellen und aktivieren können ? Wieder Isolation! - Sie haben jederzeit die Möglichkeit, zwischen der standardmäßigen Python-Version des Docker-Containers und der von Miniconda zu wechseln. Dies gibt Ihnen mehr Flexibilität, da Sie jederzeit ein neues Image mit der Änderung erstellen können.
Lassen Sie uns nun damit fortfahren, das neue Python-Anwendungs-Image mit Miniconda und Docker zu erstellen!
Voraussetzung
Falls Sie dies noch nicht getan haben, installieren Sie bitte Docker auf Ubuntu oder der von Ihnen verwendeten Linux-Distribution. Stellen Sie sicher, dass Sie sich der Docker-Gruppe hinzufügen, damit Sie Docker ohne sudo ausführen können. Sie benötigen eine aktive Internetverbindung, um das Basis-Docker-Image herunterzuladen.
Für eine Python-Beispielanwendung verwende ich ein einfaches "Hello World!" Beispiel namens python-app.py
um es Ihnen leichter zu machen, zu verstehen, wie es über Miniconda auf Docker ausgeführt wird.
Eine vollwertige Python-Anwendung, die verschiedene Python-Bibliotheken verwendet, würde sehr von demselben Verfahren profitieren, insbesondere wegen der verschiedenen Abhängigkeitsbestimmungen von Miniconda.
Schritt 1:Docker-Image abrufen [optional]
Ich habe in diesem Beispiel Python Slim anstelle von Alpine Linux gewählt. Letzteres ist wirklich klein, kann aber die Leistung beim Ausführen von Anwendungen stark beeinträchtigen. Allerdings ist Python Slim etwa 40 MB groß, basierend auf Debian Buster und Python 3.9.1.
Dieser Schritt ist optional. Ich habe es eingefügt, um zu zeigen, dass Sie es mit dem angepassten Python-Anwendungs-Image wie im vorherigen Dockerfile-Tutorial vergleichen können.
Ziehen Sie das neueste Docker-Image von Python Slim mit docker pull
Befehl:
docker pull python:slim
Schritt 2:Dockerfile mit der erforderlichen Anpassung erstellen
Lassen Sie uns nun mit dem Touch-Befehl eine neue leere Datei namens Dockerfile erstellen. Aber erstellen Sie zuerst ein Verzeichnis für Ihre Docker-App.
mkdir python-docker
cd python-docker
touch Dockerfile
Ich werde die vollständige Docker-Datei unten beifügen, nachdem ich die Schritte innerhalb des Image-Erstellungsprozesses anhand einer Schritt-für-Schritt-Anleitung der Datei erklärt habe.
Hier erfahren Sie, wie Sie mit dem Erstellen des Bildes beginnen und fortfahren:
Bereiten Sie das Basis-Image vor
Aktualisieren Sie die neuesten Standardpakete, indem Sie Python Slim als Basis-Image verwenden.
FROM python:slim
RUN apt-get update && apt-get -y upgrade \
Installieren Sie Nicht-Python-Paketabhängigkeiten
Installieren Sie alle Nicht-Python-Abhängigkeiten für Ihre Python-App (z. B. g++
und alle anderen gemäß Ihrer Anforderung).
&& apt-get install -y --no-install-recommends \
git \
wget \
g++ \
gcc \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
Git und Wget können beim Abrufen von Python-Anwendungen aus verschiedenen Repositories und URLs sehr praktisch sein. Räumen Sie schließlich etwas Platz mit rm -rf /var/lib/apt/lists/*
auf zum Minimieren der endgültigen Docker-Image-Größe.
Miniconda installieren
Nach der Installation aktualisiert Miniconda .bashrc, um zu seiner eigenen Python-Version zu wechseln.
ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
&& mkdir /root/.conda \
&& bash Miniconda3-latest-Linux-x86_64.sh -b \
&& rm -f Miniconda3-latest-Linux-x86_64.sh \
Hier wird eine Umgebungsvariable innerhalb des Container-Systempfads gesetzt. ENV
ist für die Container gedacht, die Sie auf dem Image und ARG
ausführen werden ist für Zwischencontainer gedacht, die beim ersten Bau entstehen.
Der Unterschied zwischen ENV
und ARG
Anweisungen im obigen Codeblock ist, dass letzteres nur verfügbar ist, während das Image erstellt wird. Sehen Sie sich diese schöne Erklärung hier an.
Mit wget
, laden Sie die neueste Version von Miniconda aus dem offiziellen Anaconda-Repository herunter. Nachdem Sie das wesentliche Konfigurationsverzeichnis erstellt haben, installieren Sie es und entfernen Sie schließlich das Installationsprogramm.
Miniconda für die Bash-Shell konfigurieren
Zeigen Sie nach der Installation von Miniconda die Versionsnummer zur Bestätigung an und initialisieren Sie es für die Bash-Shell für den Container . Die zweite Zeile aktualisiert Ihre Standarddatei .bashrc
Datei:
&& echo "Running $(conda --version)" && \
conda init bash && \
Lade Bash mit den neuen Änderungen neu
Laden Sie Bash für das Docker-Build-System neu, um zur Miniconda-Python-Version statt zu Debian (dem Basis-OS-Image) zu wechseln.
. /root/.bashrc && \
Aktualisieren Sie auch die standardmäßig gebündelten aktuellen Miniconda-Pakete.
conda update conda && \
Bereiten Sie eine Conda-Umgebung für Ihre App vor
Erstellen und aktivieren Sie eine separate Conda-Umgebung für Ihre Python-Anwendung.
conda create -n python-app && \
conda activate python-app && \
Installieren Sie die relevante Python-Version, die Sie für Ihre App benötigen. Angenommen, Ihre Anwendung basiert auf Python 3.6, legen Sie diese Version in der neuen virtuellen Umgebung zusammen mit Pip fest, was auch beim Verwalten von Python-Anwendungen sehr praktisch ist.
conda install python=3.6 pip && \
Installieren Sie Ihre Python-Anwendung
Je nachdem, wie Sie Ihre App verwenden, können Sie entweder:
ich. Installieren Sie es mit pip, das herkömmlicherweise die setup.py
verwendet Datei in Ihrem Repository verfügbar. Es ist dasselbe Tool, das zuvor besprochen wurde, aber hier verwende ich es stattdessen über Conda.
git clone replace-me-with-repo-url
cd repo-name
pip install -e .
ii. ..oder direkt mit python
ausführen Befehl:
git clone replace-me-with-repo-url
cd repo-name
python python-app.py
In der Dockerfile-Demo verwende ich das "Hello World!" Beispiel, damit Sie leichter verstehen, wie Sie es direkt ausführen können, indem Sie einen Container oder innerhalb seiner Bash-Shell mit Docker starten. Nehmen wir also an, ich verwende den zweiten Weg:
echo 'print("Hello World!")' > python-app.py
Nun, da ich die obige Zeile eingefügt habe, eine Datei namens python-app.py
erstellt, die die Hello World-Nachricht erzeugen soll, wenn Sie sie mit dem Befehl python python-app.py
ausführen .
Aktualisieren Sie die .bashrc-Datei für Ihre App wie Miniconda:
Das Miniconda-Installationsprogramm aktualisiert automatisch die .bashrc-Datei, nachdem Sie conda init bash
ausgeführt haben wie früher gezeigt. Dasselbe können Sie auch für Ihre Python-Anwendung tun. Immer wenn Sie die Container-Bash ausführen, wird die Umgebung aktiviert, und Sie können auch Ihren Python-Anwendungsnamen als Befehl zum Ausführen verwenden. Hier habe ich den Namen als python-app
verwendet :
RUN echo 'conda activate python-app \n\
alias python-app="python python-app.py"' >> /root/.bashrc
Vorbereiten der App für die endgültige Ausführung
Schließlich erstelle ich einen Einstiegspunkt und weise den Befehl zu, mit dem Sie ihn jedes Mal ausführen können, wenn Sie einen Container basierend auf diesem Image ausführen:
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]
Vollständige Dockerdatei
Sie können einen Editor wie Vim oder Nano verwenden oder den cat
verwenden Befehl, um die oben besprochenen Zeilen zum Dockerfile hinzuzufügen.
FROM python:slim
RUN apt-get update && apt-get -y upgrade \
&& apt-get install -y --no-install-recommends \
git \
wget \
g++ \
ca-certificates \
&& rm -rf /var/lib/apt/lists/*
ENV PATH="/root/miniconda3/bin:${PATH}"
ARG PATH="/root/miniconda3/bin:${PATH}"
RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh \
&& mkdir /root/.conda \
&& bash Miniconda3-latest-Linux-x86_64.sh -b \
&& rm -f Miniconda3-latest-Linux-x86_64.sh \
&& echo "Running $(conda --version)" && \
conda init bash && \
. /root/.bashrc && \
conda update conda && \
conda create -n python-app && \
conda activate python-app && \
conda install python=3.6 pip && \
echo 'print("Hello World!")' > python-app.py
RUN echo 'conda activate python-app \n\
alias python-app="python python-app.py"' >> /root/.bashrc
ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
CMD ["python python-app.py"]
Wenn Sie Ihre eigene App ausprobieren, ersetzen Sie echo 'print("Hello World!")' > python-app.py
Zeile oben mit einer der beiden im Abschnitt Installieren Sie Ihre Python-Anwendung beschriebenen Methoden Abschnitt oben.
Schritt 3:Erstellen Sie das Python-Anwendungsimage mit der Dockerfile
Wie Sie vielleicht bereits wissen, sieht der Befehl zum Erstellen des modifizierten Docker-Images aus der Docker-Datei folgendermaßen aus:
docker build -t python-app PATH_to_Dockerfile
Mit dem Tag -t geben Sie den Namen des Docker-Images Ihrer App an. Ich habe es als python-app
eingestellt im obigen Beispielbefehl.
Da sich die Docker-Datei in Ihrem aktuellen Verzeichnis befindet, können Sie das neue Docker-Image Ihrer Python-Anwendung wie folgt erstellen:
docker build -t python-app .
[email protected]:~/python-docker$ docker build -t python-app .
Sending build context to Docker daemon 2.56kB
Step 1/8 : FROM python:slim
---> 677f7ac99e48
Step 2/8 : RUN apt-get update && apt-get -y upgrade && apt-get install -y --no-install-recommends git wget g++ ca-certificates && rm -rf /var/lib/apt/lists/*
---> Using cache
---> 15ee9c47c83b
Step 3/8 : ENV PATH="/root/miniconda3/bin:${PATH}"
---> Using cache
---> cfd5ed6b5ec9
Step 4/8 : ARG PATH="/root/miniconda3/bin:${PATH}"
---> Using cache
---> e70d06b5ff10
Step 5/8 : RUN wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh && mkdir /root/.conda && bash Miniconda3-latest-Linux-x86_64.sh -b && rm -f Miniconda3-latest-Linux-x86_64.sh && echo "Running $(conda --version)" && conda init bash && . /root/.bashrc && conda update conda && conda create -n python-app && conda activate python-app && conda install python=3.6 pip && echo 'print("Hello World!")' > python-app.py
---> Using cache
---> 8a7957a6abb2
Step 6/8 : RUN echo 'conda activate python-app \nalias python-app="python python-app.py"' >> /root/.bashrc
---> Running in e3193e93b631
Removing intermediate container e3193e93b631
---> 948f45eb6024
Step 7/8 : ENTRYPOINT [ "/bin/bash", "-l", "-c" ]
---> Running in 621624951dcf
Removing intermediate container 621624951dcf
---> 6e8824889502
Step 8/8 : CMD ["python python-app.py"]
---> Running in dc97f9d0d8fe
Removing intermediate container dc97f9d0d8fe
---> 01bae0a9903c
Successfully built 01bae0a9903c
Successfully tagged python-app:latest
Die obige Ausgabe basiert auf zwischengespeicherten Daten, aber wenn Sie sie zum ersten Mal ausführen, würde es einige Zeit dauern und eine viel längere Protokollausgabe erzeugen.
Lassen Sie uns nun überprüfen, ob Ihr modifiziertes Docker-Image die Beispiel-App installiert hat, indem Sie einen Container daraus ausführen:
docker run python-app
[email protected]:~/python-docker$ docker run python-app
Hello World!
Über Docker und Miniconda können Sie das Programm jetzt also direkt ausführen, ohne dass eine vorherige Installation erforderlich ist! Ab jetzt brauchen Sie nur noch das Bild.
Melden wir uns jetzt bei der Bash-Shell in diesem Container an:
docker run -ti python-app bash
[email protected]:~/python-docker$ docker run -ti python-app bash
(python-app) [email protected]:/#
Wie Sie sehen können, befinden Sie sich jetzt in der Conda-aktivierten Umgebung, die Sie zuvor über die Dockerfile erstellt haben. Das -ti
flag wird verwendet, um ein interaktives Terminal für Sie zu erstellen. Sie können jetzt alternativ den Befehl verwenden, den Sie mit einem Alias versehen haben, um die App auszuführen:
(python-app) [email protected]:/# python-app
Hello World!
Lassen Sie uns auch bestätigen, dass Sie tatsächlich die Miniconda-Python-Version und nicht die Standard-Python-Version verwenden:
(python-app) [email protected]:/# python --version
Python 3.6.12 :: Anaconda, Inc.
Wie ich bereits erwähnt hatte, ist Miniconda eine miniaturisierte Version von Anaconda.
Sobald Sie alles eingerichtet haben, können Sie Ihr endgültiges Image an Docker Hub übertragen, wenn Sie eine Open-Source-Python-Anwendung auf GitHub, GitLab, Gitea, Bitbucket oder einem anderen Repository hosten.
Verlassen Sie den Container, indem Sie im Terminal exit eingeben. Stoppen Sie den Container, entfernen Sie den Container und entfernen Sie die Docker-Images (falls Sie möchten), um Speicherplatz freizugeben.
Herzlichen Glückwunsch! Sie haben gerade gelernt, wie Sie Ihr eigenes Docker-Image für Ihre Python-Anwendung erstellen.
War es hilfreich für Sie?
Sie sehen also, Miniconda hilft Ihnen nicht nur, Ihre Anwendung auf Benutzerebene flexibler und zukunftssicherer zu machen, sondern erleichtert auch die Rolle des Entwicklers erheblich.
Denken Sie daran, wie bequem es wäre, dies mit PyCharm einzurichten! Sie installieren Miniconda und Ihre Python-Anwendung wie auf einem Hostsystem, aber da Sie es als Docker-Image erstellen und speichern, ist es nur ein einmaliger Prozess!
Wenn Sie möchten, können Sie mit den verschiedenen Beispielen experimentieren, die in diesem vorherigen Tutorial gezeigt wurden, anstatt mit dem "Hello World!" Beispiel, das ich hier verwendet habe.
Hoffe das hilft! Wenn Sie Fragen oder Anregungen haben, hinterlassen Sie bitte unten einen Kommentar.