Bắt đầu một vỏ trong container Docker Alpine


165

Để bắt đầu một vỏ tương tác cho hình ảnh Ubuntu, chúng ta có thể chạy:

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

Nhưng khi điều này được chạy cho hình ảnh Docker của Alpine , kết quả như sau:

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

Lệnh để bắt đầu một lớp vỏ tương tác trong một thùng chứa cơ sở Alps là gì?

Câu trả lời:


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

Các tùy chọn được sử dụng ở trên:

  • /bin/ashlà Ash ( Almquist Shell ) được cung cấp bởi BusyBox
  • --rmTự động loại bỏ container khi thoát ( docker run --help)
  • -i Chế độ tương tác (Giữ STDIN mở ngay cả khi không được đính kèm)
  • -t Phân bổ một giả TTY

1
Chắc chắn - ý tưởng tốt - tro là vỏ và --rm loại bỏ container sau khi chạy xong. Vì vậy, nếu bạn muốn container vẫn có sẵn sau khi chạy thì bỏ qua việc sử dụng --rm. Tôi đang sử dụng nó vì tôi chỉ đang thử nghiệm ATM.
Ole

Vậy thì làm thế nào để chạy nó với thuộc tính tách rời như ubfox?
Benyamin Limanto

Tôi tin vào cả hai trường hợp ... Ubuntu hoặc Alpine ... bạn chỉ cần cung cấp cho nó một -dtùy chọn.
Ole

2
+1 vì đã lưu ý rằng Alpine có ashvà không bash, điều mà, không quen thuộc lắm với Alpine, là điều khiến tôi và ngăn tôi truy cập vào container trước đó.
code_dredd

Nếu bạn đang sử dụng RHEL và bị từ chối cấp phép, thì đó lại là TỰ TIN ... phải tạm thời thiết lập lực lượng 0: P
Parth Patel

67

Thông thường, một hình ảnh Alpine Linux không chứa bash, Thay vào đó bạn có thể sử dụng /bin/ash, /bin/sh, ashhoặc chỉ sh.

/ thùng / tro

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

/ thùng / sh

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

tro

docker run -it --rm alpine ash

sh

docker run -it --rm alpine sh

Tôi hi vọng thông tin này có thể giúp gì đó cho bạn.


1
Sự khác biệt giữa /bin/ashvà là ashgì? Tương tự cho /bin/shsh.
Peter Mortensen

1
Xin chào @ peter-mortensen, sự khác biệt ashchỉ là một liên kết tượng trưng đến /bin/ash. Một số bản phân phối linux không có liên kết tượng trưng.
jansanchez

28

Ngày nay, hình ảnh Alps sẽ khởi động trực tiếp vào /bin/shtheo mặc định mà không phải chỉ định trình bao để thực thi:

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

Điều này là do alpineDockerfiles hình ảnh hiện chứa một CMDlệnh, chỉ định shell sẽ thực thi khi container bắt đầu : CMD ["/bin/sh"].

Trong các phiên bản hình ảnh cũ của Alpine (trước năm 2017), lệnh CMD không được sử dụng, vì Docker đã sử dụng để tạo một lớp bổ sung cho CMD khiến kích thước hình ảnh tăng lên. Đây là điều mà các nhà phát triển hình ảnh Alpine muốn tránh. Trong các phiên bản Docker gần đây (1.10+), CMD không còn chiếm một lớp và do đó, nó đã được thêm vào alpinehình ảnh. Do đó, miễn là không bị ghi đè, các hình ảnh gần đây của Alpine sẽ khởi động /bin/sh.

Để tham khảo, hãy xem cam kết sau đây với các Dockerfiles chính thức của Glider Labs:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3bbbbbbbb


4

Trong trường hợp container đang chạy:

docker exec -it container_id_or_name ash
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.