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 cmd
my-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
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. –
... 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. –