Uruchamianie powłoki w kontenerze Docker Alpine

165

Aby uruchomić interaktywną powłokę dla obrazu Ubuntu, możemy uruchomić:

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

Ale gdy jest to uruchamiane dla obrazu Alpine Docker , następujące wyniki:

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

Jakie jest polecenie uruchamiania powłoki interaktywnej w kontenerze bazowym Alpine?

Ole
źródło

Odpowiedzi:

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

Opcje użyte powyżej:

  • /bin/ashto Ash ( Almquist Shell ) udostępniany przez BusyBox
  • --rmAutomatycznie usuń kontener po wyjściu ( docker run --help)
  • -i Tryb interaktywny (pozostaw STDIN otwarty, nawet jeśli nie jest podłączony)
  • -t Przydziel pseudo-TTY
Ole
źródło
1
Jasne - dobry pomysł - popiół to powłoka, a --rm usuwa pojemnik po zakończeniu przebiegu. Więc jeśli chcesz, aby kontener był nadal dostępny po uruchomieniu, pomiń użycie --rm. Używam go, ponieważ eksperymentuję tylko z bankomatem.
Ole
Więc jak uruchomić go z właściwością odłączania, taką jak ubuntu?
Benyamin Limanto
Wierzę, że w obu przypadkach ... Ubuntu lub Alpine ... po prostu dajesz mu -dopcję.
Ole
2
+1 za zauważenie, że Alpine ma, asha nie bash, co, będąc niezbyt zaznajomionym z Alpine, jest tym, co mnie złapało i uniemożliwiło mi wcześniejszy dostęp do kontenera.
code_dredd
Jeśli jesteś na RHEL i otrzymujesz błąd odmowy pozwolenia, to znowu SELinux ... muszę to zrobić tymczasowo setenforce 0: P
Parth Patel
67

Zazwyczaj Alpine Linux obraz nie zawiera bash, Zamiast tego można użyć /bin/ash, /bin/sh, ashlub tylko sh.

/ bin / ash

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

/ bin / sh

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

popiół

docker run -it --rm alpine ash

sh

docker run -it --rm alpine sh

Mam nadzieję, że te informacje pomogą Ci.

jansanchez
źródło
1
Jaka jest różnica między /bin/ashi ash? Podobnie dla /bin/shi sh.
Peter Mortensen
1
Cześć @ peter-mortensen, różnica polega na tym, że ashjest to tylko symboliczne łącze do /bin/ash. Niektóre dystrybucje Linuksa nie mają dowiązań symbolicznych.
jansanchez
28

Obecnie obrazy Alpine /bin/shdomyślnie uruchamiają się bezpośrednio , bez konieczności określania powłoki do wykonania:

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

Jest to ponieważ alpineDockerfiles obraz teraz zawierać CMDpolecenia, który określa powłoki wykonać po uruchomieniu kontenerowych: CMD ["/bin/sh"].

W starszych wersjach obrazu Alpine (sprzed 2017 r.) Polecenie CMD nie było używane, ponieważ Docker używał do utworzenia dodatkowej warstwy dla CMD, co spowodowało zwiększenie rozmiaru obrazu. To jest coś, czego twórcy grafiki Alpine chcieli uniknąć. W ostatnich wersjach Dockera (1.10+) CMD nie zajmuje już warstwy, więc został dodany do alpineobrazów. Dlatego tak długo, jak CMD nie zostanie zastąpiony, najnowsze obrazy Alpine zostaną uruchomione /bin/sh.

Aby uzyskać więcej informacji, zobacz poniższe zobowiązanie do oficjalnych plików Alpine Dockerfiles firmy Glider Labs:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92c17cf53c96578b

Valiano
źródło
4

W przypadku, gdy kontener już działa:

docker exec -it container_id_or_name ash
Marcos
źródło