การเริ่มต้นเชลล์ในคอนเทนเนอร์ Docker Alpine


165

ในการเริ่มเปลือกโต้ตอบสำหรับภาพ Ubuntu เราสามารถเรียกใช้:

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

แต่เมื่อสิ่งนี้ถูกเรียกใช้สำหรับอิมเมจ Alpine Dockerผลลัพธ์ต่อไปนี้:

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

คำสั่งสำหรับการเริ่มเปลือกโต้ตอบในภาชนะฐานอัลไพน์คืออะไร?

คำตอบ:


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

ตัวเลือกที่ใช้ด้านบน:

  • /bin/ashคือ Ash ( Almquist Shell ) จัดหาโดย BusyBox
  • --rmนำภาชนะออกโดยอัตโนมัติเมื่อออก ( docker run --help)
  • -i โหมดอินเทอร์แอกทีฟ (เปิด STDIN ค้างไว้แม้ไม่ได้ต่ออยู่)
  • -t จัดสรรหลอก -YTY

1
แน่นอน - ความคิดที่ดี - เถ้าคือเปลือกและ --rm จะลบคอนเทนเนอร์หลังจากการรันเสร็จสมบูรณ์ ดังนั้นหากคุณต้องการให้คอนเทนเนอร์ยังคงมีอยู่หลังจากการรันให้ข้ามการใช้ --rm ฉันใช้มันเพราะฉันแค่ทดลองใช้ ATM
โอเล

ถ้าอย่างนั้นวิธีการเรียกใช้กับคุณสมบัติแยกออกเช่นอูบุนตู?
Benyamin Limanto

ฉันเชื่อในทั้งสองกรณี ... อูบุนตูหรืออัลไพน์ ... คุณเพียงแค่ให้มันเป็น-dตัวเลือก
โอเล

2
+1 สำหรับการสังเกตว่าอัลไพน์มีashและไม่bashซึ่งไม่คุ้นเคยกับอัลไพน์เป็นสิ่งที่ทำให้ฉันและป้องกันไม่ให้ฉันเข้าถึงภาชนะก่อนหน้านี้
code_dredd

หากคุณอยู่ใน RHEL และได้รับการปฏิเสธข้อผิดพลาดเป็น SELinux อีกครั้ง ... ต้องทำเช่นนั้นกำหนด 0 ชั่วคราว: P
Parth Patel

67

โดยปกติภาพอัลไพน์ลินุกซ์ไม่ได้มีbash, แต่คุณสามารถใช้/bin/ash, /bin/sh, หรือเฉพาะashsh

/ bin / เถ้า

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

bin / sh /

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

เถ้า

docker run -it --rm alpine ash

ดวลจุดโทษ

docker run -it --rm alpine sh

ฉันหวังว่าข้อมูลนี้จะช่วยคุณ


1
ความแตกต่างระหว่าง/bin/ashและashคืออะไร? ที่คล้ายกันและ/bin/sh sh
Peter Mortensen

1
สวัสดี @ Peter-Mortensen ความแตกต่างก็คือว่า เป็นเพียงการเชื่อมโยงสัญลักษณ์ash /bin/ashการแจกแจงลินุกซ์บางตัวไม่มีลิงก์สัญลักษณ์
jansanchez

28

ทุกวันนี้อิมเมจอัลไพน์จะบู๊ตโดยตรง/bin/shตามค่าเริ่มต้นโดยไม่ต้องระบุเชลล์เพื่อดำเนินการ:

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

นี่คือตั้งแต่alpineDockerfiles ภาพในขณะนี้มีคำสั่งที่ระบุเปลือกในการดำเนินการเมื่อคอนเทนเนอร์เริ่มต้น:CMD CMD ["/bin/sh"]

ในเวอร์ชันอัลไพน์รุ่นเก่า (ก่อนปี 2017) คำสั่ง CMD ไม่ได้ถูกใช้เนื่องจาก Docker ใช้เพื่อสร้างเลเยอร์เพิ่มเติมสำหรับ CMD ซึ่งทำให้ขนาดรูปภาพเพิ่มขึ้น นี่คือสิ่งที่นักพัฒนาภาพอัลไพน์ต้องการหลีกเลี่ยง ในเวอร์ชัน Docker ล่าสุด (1.10+) CMD จะไม่ใช้เลเยอร์อีกต่อไปดังนั้นจึงถูกเพิ่มลงในalpineรูปภาพ ดังนั้นตราบใดที่ CMD /bin/shไม่ได้แทนที่ภาพอัลไพน์ที่ผ่านมาจะบูตเข้า

สำหรับการอ้างอิงดูการกระทำต่อไปนี้เพื่ออัลไพน์ Dockerfiles อย่างเป็นทางการโดย Glider Labs:
https://github.com/gliderlabs/docker-alpine/commit/ddc19dd95ceb3584ced58be0b8d7e9169d04c7a3#diff-db3dfee92c17cfc565878


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.