Docker Exec - Ausführen eines Befehls in einem Docker-Image oder -Container

Ich werde Sie hier in ein DevOps-Geheimnis einweihen: Alles, was DevOpsy-Leute gerne tun, ist, ein super schickes und komplexes System aufzubauen und dann einen Weg zu finden, wie eine normale Shell damit umzugehen. Oder stellen Sie mit SSH eine Verbindung her und behandeln Sie es dann wie eine normale Shell.

Docker ist nicht anders! Sie führen einen Computer in einem anderen Computer aus. Möglicherweise ist dieser Computer eine EC2-Instanz oder ein Laptop. Sie können sogar richtig verrückt werden und eine VM ausführen, auf der dann Docker ausgeführt wird.

Wenn ich Docker verwende, verwende ich es meistens zum Packen und Verteilen einer Anwendung. Manchmal benutze ich es für etwas Cooleres wie ein verteiltes Computerprojekt. Aber oft werfe ich eine Docker-Datei in ein GitHub-Repo, damit ich keine CLIs installieren muss, von denen ich nur weiß, dass sie irgendwann auf meinem Laptop in Konflikt geraten.

Kurz gesagt, Sie können Docker anweisen, den Befehl auszuführen bash, der Sie in eine Shell fallen lässt:

docker run -it name-of-image bash # docker run -it continuumio/miniconda3:latest bash # docker run -it node:latest bash

Aber lesen Sie weiter für mehr. ;-);

Versuch es

Google ist der Docker Ihrer Lieblingsprogrammiersprache. Für mich ist das Python und speziell mag ich Conda. Führen Sie dann einige Befehle aus, um sicherzustellen, dass Sie sich tatsächlich in dieser Shell befinden.

# From Host echo $(pwd) # Drop into docker shell docker run -it continuumio/miniconda3:latest bash # Now you are in the docker shell! echo $(pwd) echo $USER

Cool was? Dies ist perfekt zum Debuggen eines Containers, der unbedingt ordnungsgemäß funktionieren sollte. Es eignet sich auch hervorragend für meinen häufigsten Anwendungsfall "Ich möchte dies nicht auf meinem Computer installieren".

Debuggen Sie einen Docker Build mit Docker Run

Wenn Sie versuchen, Docker-Builds zu debuggen, ist es hilfreich, Ihr Docker-Image wie eine normale Shell zu behandeln.

Angenommen, Sie haben eine Docker-Datei für ein Image, das Sie erstellen möchten. Normalerweise führt docker build -t my-image .Docker beim Ausführen (-t steht für Tag) jeden Ihrer RUN-Schritte durch und stoppt, wenn ein Befehl angezeigt wird, der nicht ordnungsgemäß beendet wird.

In einer UNIX-Shell bedeutet der Exit-Code 0, dass mit einem Befehl alles in Ordnung ist. Um diesen Punkt zu veranschaulichen, habe ich dafür gesorgt, dass unsere Docker-Datei einen RUN-Befehl hat, der mit 1 beendet wird.

FROM continuumio/miniconda3:latest RUN apt-get update -y; \ apt-get upgrade -y; \ apt-get install -y \ vim-tiny vim-athena build-essential RUN conda update conda \ && conda clean --all --yes RUN exit 1
docker build -t my-image .

Dadurch erhalten Sie eine Ausgabe, die wie folgt aussieht:

(base) ➜ my-image docker build -t my-image . Sending build context to Docker daemon 2.048kB Step 1/4 : FROM continuumio/miniconda3:latest ---> 406f2b43ea59 Step 2/4 : RUN apt-get update -y; apt-get upgrade -y; apt-get install -y vim-tiny vim-athena build-essential ---> Using cache ---> 726af29a48a0 Step 3/4 : RUN conda update conda && conda clean --all --yes ---> Using cache ---> 19478bb3ce67 Step 4/4 : RUN exit 1 ---> Running in 7c98aab6b52c The command '/bin/sh -c exit 1' returned a non-zero code: 1

Sie können bestätigen, dass Ihr Docker-Image nicht erstellt wurde, indem Sie es ausführen docker imagesund nach suchen my-image. Es wird nicht da sein, weil es nicht erfolgreich gebaut wurde.

Jetzt können wir diesen problematischen Dockerfile RUN-Befehl auskommentieren.

FROM continuumio/miniconda3:latest RUN apt-get update -y; \ apt-get upgrade -y; \ apt-get install -y \ vim-tiny vim-athena build-essential RUN conda update conda \ && conda clean --all --yes #RUN exit 1

Dann werden Sie sehen:

Sending build context to Docker daemon 2.048kB Step 1/3 : FROM continuumio/miniconda3:latest ---> 406f2b43ea59 Step 2/3 : RUN apt-get update -y; apt-get upgrade -y; apt-get install -y vim-tiny vim-athena build-essential ---> Using cache ---> 726af29a48a0 Step 3/3 : RUN conda update conda && conda clean --all --yes ---> Using cache ---> 19478bb3ce67 Successfully built 19478bb3ce67 Successfully tagged my-image:latest 

Sie können jetzt in Ihr Docker-Image einsteigen und Befehle interaktiv ausführen!

docker run -it my-image bash # you can also run # docker run -it my-image:latest bash

Von hier aus können Sie nacheinander Ihre RUN-Befehle debuggen, um festzustellen, was schief gelaufen ist. Wenn Sie nicht sicher sind, ob ein Befehl ordnungsgemäß beendet wurde oder nicht, führen Sie Folgendes aus $?:

# First run docker run -it my-image bash to get to the shell # Print the string hello echo "hello" # hello echo $? # 0 # Run a non existant command hello $(hello) # bash: hello: command not found echo $? # 127

Sie können diese Schritte so lange ausführen, Ihre Docker-Datei auskommentieren, in eine Shell einfügen und problematische Befehle herausfinden, bis Ihre Docker-Images perfekt erstellt sind.

Einpacken

Hoffentlich habe ich Ihnen gezeigt, dass sich die Verwendung eines Docker-Images nicht vom Terminal auf Ihrem Computer unterscheidet. Die Verwendung von Docker-Bildern ist eine großartige Möglichkeit, Anwendungen zu verteilen.

Versuchen Sie, Ihre Lieblings-CLI-Anwendung oder das nächste GitHub-Projekt zu verwenden, und packen Sie es mit Docker, anstatt ein Installationsskript zu erstellen. ;-);