2017-07-29 5 views
0

Es scheint einen Unterschied zu geben, wie Docker Befehle in einem Dockerfile im Gegensatz zu Befehlen ausführt, die nach dem Start eines Containers manuell ausgeführt werden. Dies scheint auf die Art von Shells zurückzuführen zu sein, die Sie starten können, eine (ich nehme an) nicht-interaktive Shell mit einer Dockerfile vs. einer interaktiven Shell, wenn Sie etwas wie docker run -it <some-img-id> ausführen.Wie führe ich Docker cmds aus? Genau wie in einer Dockerfile

Wie kann ich laufende Befehle in einem Docker-Container so debuggen, dass sie genauso ausgeführt werden, wie die Befehle von einer Docker-Datei ausgeführt werden? Wäre es einfach /bin/bash --noprofile dem run cmd hinzuzufügen? Oder gibt es noch etwas anderes an der Umgebung, wenn Sie von einer Dockerdatei aus gestartet werden?

+0

Es gibt keine generische Antwort auf diese - wir müssten sehen, die ** spezifische ** Befehl, den Sie fragen. A [mcve], die anderen zeigt, wie man den Unterschied für sich selbst sieht, wäre auch hilfreich. –

+0

... Befehle wie 'COPY' sind komplett intern in Docker implementiert - sie rufen überhaupt keine Shell auf. Und 'RUN' und Kin haben verschiedene Modi - wenn Sie eine Literalargumentliste als Array übergeben, wieder keine Shell irgendwo. –

Antwort

1

Was Sie erleben, ist das Verhalten wegen der Shell. Die meiste Verwendung wird verwendet, um Bash Shell zu verwenden. So im Allgemeinen würden wir versuchen, die Befehle in folgenden Art und Weise

Für neue Container

docker run -it <imageid> bash 

Für bestehende Behälter

docker exec -it <containerid> bash 

Aber laufen, wenn wir einig Befehl RUN Richtlinie innerhalb angeben ein Dockerfile

RUN echo Testing 

Dann ist es gleich /bin/sh -c 'echo Testing' läuft. Sie können also gewisse Unterschiede erwarten, da beide Schalen unterschiedlich sind.

In Docker 1.12 oder höher haben Sie eine Dockerfile Richtlinie genannt SHELL Damit können Sie die Standardeinstellung außer Kraft setzen SHELL

SHELL ["/bin/bash", "-c"] 
RUN echo Testing 

Dies ist der RUN Befehl als bash -c 'echo Testing' ausgeführt werden würde. Sie können mehr über die -Direktive lernen here

1

Kurze Antwort 1:

Wenn Dockerfile nicht verwenden USER und SHELL Befehle, dann diese:

docker --entrypoint "/bin/sh -c" -u root <image> cmd 

Kurze Antwort 2:

Wenn Sie nicht tun Komprimieren oder komprimieren Sie das Bild nach dem Erstellen. Docker erstellt für jeden Dockerfile-Befehl Bildebenen. Sie können sie in der Ausgabe von docker build am Ende jeder Stufe mit ---> sehen:

Step 2/8 : WORKDIR /usr/src/app 
    ---> 5a5964bed25d # <== THIS IS IMAGE ID OF STEP 2 
Removing intermediate container b2bc9558e499 
Step 3/8 : RUN something 
    ---> f6e90f0a06e2 # <== THIS IS IMAGE ID OF STEP 3 
Removing intermediate container b2bc9558e499 

Achten Sie auf die Bild-ID, kurz bevor der RUN Schritt, den Sie debuggen möchten (zB Sie debuggen Schritt wollen 3 auf dem oberen , nehmen Sie die Bild ID Schritt 2). Dann führen Sie einfach den Befehl in diesem Bild:

docker run -it 5a5964bed25d cmd 

Lange Antwort 1:

Wenn Sie docker run [image] cmd Docker in der Tat laufen beginnt die cmd auf diese Weise:

  • Führt den Standardeinstiegspunkt des Bildes mit der cmd als Argument. Der Einstiegspunkt wird im Image beim Build von ENTRYPOINT in Dockerfile gespeichert. Dh wenn cmdmy-app ist und der Einsprungpunkt /bin/sh -c ist, wird /bin/sh -c my-app ausgeführt.
  • beginnt es mit Standard-Benutzer-ID des Bildes, die
  • durch den letzten USER Befehl in Dockerfile definiert ist
  • beginnt es mit den Umgebungsvariablen aus allen ENV Befehlen von Dockerfile Image commulative

Wenn docker build die Läufe Dockerfile RUN, es ist genau das gleiche, nur mit den zu dieser Zeit (Zeile) der Dockerfile vorhandenen Werten.

Um genau zu sein, müssen Sie den Wert von ENVs und den letzten USER-Befehl vor Ihrer RUN-Linie nehmen und diese im docker run-Befehl verwenden.

Die häufigsten Bilder haben /bin/sh -c oder /bin/bash -c als Einstiegspunkt und höchstwahrscheinlich arbeitet der Build mit Root-Benutzer.Daher sollte docker --entrypoint "/bin/bash -c" -u root <image> cmd ausreichen

Verwandte Themen