Starten einer Shell im Docker Alpine Container

164

Um eine interaktive Shell für das Ubuntu-Image zu starten, können wir Folgendes ausführen:

ole@T:~$ docker run -it --rm ubuntu
root@1a6721e1fb64:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

Wenn dies jedoch für das Alpine Docker-Image ausgeführt wird , führt dies zu folgenden Ergebnissen:

ole@T:~$ docker run -it --rm alpine
Error response from daemon: No command specified

Was ist der Befehl zum Starten einer interaktiven Shell in einem alpinen Basiscontainer?

Ole
quelle

Antworten:

280
ole@T:~$ docker run -it --rm alpine /bin/ash
(inside container) / # 

Oben verwendete Optionen:

  • /bin/ashist Ash ( Almquist Shell ) von BusyBox
  • --rmEntfernen Sie den Container automatisch, wenn er beendet wird ( docker run --help)
  • -i Interaktiver Modus (STDIN offen halten, auch wenn nicht angeschlossen)
  • -t Ordnen Sie eine Pseudo-TTY zu
Ole
quelle
1
Sicher - gute Idee - Asche ist die Schale und --rm entfernt den Behälter nach Abschluss des Laufs. Wenn Sie also möchten, dass der Container nach dem Ausführen noch verfügbar ist, überspringen Sie die Verwendung von --rm. Ich benutze es, da ich nur mit Geldautomaten experimentiere.
Ole
Wie kann man es dann mit einer Eigenschaft wie Ubuntu ausführen?
Benyamin Limanto
Ich glaube in beiden Fällen ... Ubuntu oder Alpine ... geben Sie ihm einfach eine -dOption.
Ole
2
+1 für die Feststellung, dass Alpine hat ashund nicht bash, was mich, da ich mit Alpine nicht sehr vertraut bin, dazu gebracht hat, früher auf den Container zuzugreifen.
code_dredd
Wenn Sie auf RHEL sind und die Berechtigung verweigert Fehler erhalten, ist es wieder SELinux ... muss diese Setenforce 0 vorübergehend tun: P
Parth Patel
67

Üblicherweise wird ein Alpine Linux - Image enthält nicht bash, stattdessen können Sie verwenden /bin/ash, /bin/sh, ashoder nur sh.

/ bin / ash

docker run -it --rm alpine /bin/ash

/ bin / sh

docker run -it --rm alpine /bin/sh

Asche

docker run -it --rm alpine ash

Sch

docker run -it --rm alpine sh

Ich hoffe, diese Informationen helfen Ihnen.

jansanchez
quelle
1
Was ist der Unterschied zwischen /bin/ashund ash? Ähnliches gilt für /bin/shund sh.
Peter Mortensen
1
Hallo @ peter-mortensen, der Unterschied ist, dass ashnur eine symbolische Verbindung zu ist /bin/ash. Einige Linux-Distributionen haben keine symbolischen Links.
jansanchez
28

Heutzutage werden alpine Images /bin/shstandardmäßig direkt gestartet, ohne dass eine Shell zum Ausführen angegeben werden muss:

$ sudo docker run -it --rm alpine  
/ # echo $0  
/bin/sh  

Dies ist seit dem alpineCMD , dass Image-Docker-Dateien jetzt einen Befehl enthalten , der die Shell angibt, die ausgeführt werden soll, wenn der Container gestartet wird : CMD ["/bin/sh"].

In älteren alpinen Bildversionen (vor 2017) wurde der CMD-Befehl nicht verwendet, da Docker eine zusätzliche Ebene für CMD erstellt hat, wodurch die Bildgröße zunahm. Dies wollten die alpinen Bildentwickler vermeiden. In neueren Docker-Versionen (1.10+) belegt CMD keine Ebene mehr und wurde daher zu alpineBildern hinzugefügt . Solange CMD nicht überschrieben wird, werden daher aktuelle Alpine-Images gestartet /bin/sh.

Weitere Informationen finden Sie im folgenden Commit für die offiziellen Alpine Dockerfiles von Glider Labs:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf9cf

valiano
quelle
4

Falls der Container bereits läuft:

docker exec -it container_id_or_name ash
Marcos
quelle