Memulai shell di wadah Docker Alpine

165

Untuk memulai shell interaktif untuk gambar Ubuntu kita dapat menjalankan:

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

Tetapi ketika ini dijalankan untuk gambar Alpine Docker , hasil berikut:

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

Apa perintah untuk memulai shell interaktif dalam wadah berbasis Alpine?

Ole
sumber

Jawaban:

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

Opsi yang digunakan di atas:

  • /bin/ashadalah Ash ( Almquist Shell ) yang disediakan oleh BusyBox
  • --rmHapus wadah secara otomatis saat keluar ( docker run --help)
  • -i Mode interaktif (Biarkan STDIN tetap terbuka meskipun tidak terpasang)
  • -t Alokasikan pseudo-TTY
Ole
sumber
1
Tentu - ide bagus - abu adalah cangkang dan --rm menghapus wadah setelah proses selesai. Jadi, jika Anda ingin wadah masih tersedia setelah dijalankan maka abaikan penggunaan --rm. Saya menggunakannya karena saya hanya bereksperimen dengan ATM.
Ole
Lalu bagaimana cara menjalankannya dengan melepaskan properti seperti ubuntu?
Benyamin Limanto
Saya percaya pada kedua kasus ... Ubuntu atau Alpine ... Anda hanya memberikan -dpilihan.
Ole
2
1 untuk mencatat bahwa Alpine memiliki ashdan tidak bash, yang, karena tidak terlalu mengenal Alpine, adalah apa yang membuat saya dan mencegah saya mengakses wadah sebelumnya.
code_dredd
Jika Anda menggunakan RHEL dan mendapatkan izin ditolak kesalahan, itu SELinux lagi ... harus melakukan setenforce 0 sementara: P
Parth Patel
67

Biasanya, gambar Alpine Linux tidak mengandung bash, Sebaliknya Anda dapat menggunakan /bin/ash, /bin/sh, ashatau hanya sh.

/ bin / ash

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

/ bin / sh

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

Abu

docker run -it --rm alpine ash

SH

docker run -it --rm alpine sh

Saya harap informasi ini membantu Anda.

jansanchez
sumber
1
Apa perbedaan antara /bin/ashdan ash? Mirip untuk /bin/shdan sh.
Peter Mortensen
1
Hai @ peter-mortensen, perbedaannya ashhanyalah tautan simbolis /bin/ash. Beberapa distribusi linux tidak memiliki tautan simbolik.
jansanchez
28

Saat ini, gambar Alpine akan di-boot langsung ke /bin/shdefault, tanpa harus menentukan shell untuk dieksekusi:

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

Hal ini karena alpineDockerfiles gambar sekarang mengandung CMDperintah, yang menentukan shell untuk mengeksekusi ketika wadah dimulai: CMD ["/bin/sh"].

Dalam versi gambar Alpine yang lebih lama (pra-2017), perintah CMD tidak digunakan, karena Docker digunakan untuk membuat lapisan tambahan untuk CMD yang menyebabkan ukuran gambar meningkat. Ini adalah sesuatu yang ingin dihindari oleh pengembang gambar Alpine. Dalam versi Docker baru-baru ini (1,10+), CMD tidak lagi menempati lapisan, dan karena itu ditambahkan ke alpinegambar. Oleh karena itu, selama CMD tidak diganti, gambar Alpine terbaru akan di-boot /bin/sh.

Untuk referensi, lihat komitmen berikut untuk Dockerfiles Alpine resmi oleh Glider Labs:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfdee92b17cfc

valiano
sumber
4

Jika wadah sudah berjalan:

docker exec -it container_id_or_name ash
Marcos
sumber