ฉันจะลบล้าง CMD ได้อย่างไรเมื่อเรียกใช้อิมเมจนักเทียบท่า?


123

ฉันต้องการตรวจสอบภาพนักเทียบท่าที่สร้างโดยบุคคลอื่นที่มีทั้งจุดเข้าใช้งานและคำสั่งที่ระบุเช่น:

ENTRYPOINT ["/usr/sbin/apache2ctl"]
CMD ["-D", "FOREGROUND"]

ฉันกำลังทำ:

docker run --interactive --tty --entrypoint=/bin/bash $IMAGE --login

มีวิธีการแทนที่ CMD ให้ว่างเปล่าหรือไม่ (ดังนั้นฉันไม่ต้องใช้ "--login")?

คำตอบ:


125

คุณสามารถป้อนผ่านdocker run -it --entrypoint=/bin/bash $IMAGE -i(คุณจะเปิดตัวคอนเทนเนอร์ใหม่จากภาพและรับ bash shell ในโหมดโต้ตอบ) จากนั้นเรียกใช้คำสั่ง entrypoint ในคอนเทนเนอร์นั้น

จากนั้นคุณสามารถตรวจสอบคอนเทนเนอร์ที่กำลังทำงานอยู่ในสถานะที่ควรรัน

แก้ไข: ตั้งแต่ Docker 1.3 คุณสามารถใช้execเพื่อเรียกใช้กระบวนการในภาชนะที่กำลังทำงานอยู่ เริ่มคอนเทนเนอร์ของคุณตามปกติแล้วป้อนโดยการออก:

docker exec -it $CONTAINER_ID /bin/bash

สมมติว่ามีการติดตั้ง bash คุณจะได้รับสิทธิ์การเข้าถึงเชลล์ไปยังคอนเทนเนอร์ที่รันอยู่


จะไม่ดำเนินการ "/ usr / sbin / apache2ctl / bin / bash" หรือไม่ (เนื่องจากตัวอย่างของคุณไม่ได้แทนที่จุดเข้าใช้งานมันจะใช้จุดเข้าใช้งานที่กำหนดไว้ใน Dockerfile - หรือว่าฉันทำอะไรหายไป?)
warp

เป็นสิ่งที่แตกต่างกันไปสำหรับรุ่นเก่าหรือใหม่กว่านักเทียบท่าหรือไม่? แน่นอนมันวิ่ง entrypoint สำหรับฉัน: gist.github.com/warpr/26a5cc471dce7fcf9021 นี่คือการใช้นักเทียบท่า 0.10.0 บน Ubuntu 13.10
วาร์ป

4
ฉันรู้ว่าการผ่าน - ผู้เข้าร่วมจะแทนที่จุดเข้า แต่เมื่อฉันใช้ - ผู้ชี้จุดฉันจะลบล้าง CMD ให้ว่างได้อย่างไร (สำหรับ bash ฉันสามารถใช้บางอย่างเช่น -i หรือ --login ได้ แต่ไม่ใช่จุดเข้าใช้งานทั้งหมดที่ฉันอาจต้องการใช้จะมีอาร์กิวเมนต์ "dummy" ที่เทียบเท่า)
วิปริต

1
อย่างน้อยใน Docker v1.11.1 ดูเหมือนว่าการแทนที่ --entrypoint จะป้องกันการผนวก CMD เข้ากับจุดเข้าใช้งานตามปกติ ที่ดูเหมือนว่าจะเกิดขึ้นเมื่อจุดเข้าไม่ได้ถูกแทนที่
จัสมิน Hegman

1
ทำไมถึงเกิด-iหลังจาก$IMAGE?
Eyal Levin

27

ดู: https://docs.docker.com/engine/reference/run/#overriding-dockerfile-image-defaults

ส่วนที่เกี่ยวข้อง:

CMD (คำสั่งเริ่มต้นหรือตัวเลือก) เรียกคืนคำสั่งทางเลือกใน Commandline Docker:

$ docker run [OPTIONS] IMAGE[:TAG] [COMMAND] [ARG...]

คำสั่งนี้เป็นทางเลือกเนื่องจากบุคคลที่สร้าง IMAGE อาจให้ค่าเริ่มต้น COMMAND โดยใช้ Dockerfile CMD ในฐานะผู้ดำเนินการ (ผู้ที่ใช้คอนเทนเนอร์จากภาพ) คุณสามารถแทนที่ CMD นั้นได้เพียงแค่ระบุคำสั่งใหม่

หากรูปภาพระบุ ENTRYPOINT ด้วยเช่นกัน CMD หรือคำสั่งจะถูกต่อท้ายเป็นอาร์กิวเมนต์ของ ENTRYPOINT

เพื่อที่จะทำในสิ่งที่คุณต้องการคุณต้องการเพียงระบุ cmd /bin/bashและแทนที่การใช้ ไม่ได้ค่อนข้าง "ว่างเปล่า" แต่ได้งานเสร็จ 99%


อ๊ะฉันมองข้ามรายละเอียด ยกเว้นการย่อ--loginให้สั้นลง-lฉันเดาว่าโซลูชันของคุณดีพอที่จะรับได้แล้ว
Simon Thum

นี่คือสิ่งที่สนุกที่ฉันเห็นในวันนี้: คำสั่งไม่ถูกเขียนทับมันต่อท้าย นี่คือ PS จากภายในคอนเทนเนอร์ โปรดทราบว่าคำสั่งที่ฉันเพิ่มคือ echo "การตั้งค่า db" และคำสั่งในตัวคือ / usr / bin / geth ฉันตั้งค่าจุดเข้าใช้งานเป็น "" 1 ? Ssl 0:00 /usr/bin/geth echo setting up db
พอล S

ลิงก์อ้างอิงนักเทียบท่าใช้งานไม่ได้แล้ว - ไม่พบการแทนที่ที่ชัดเจนสำหรับมัน
Chris Kimpton

ฉันเพิ่งซ่อมมัน แต่ฉันก็พบว่ามันหายาก (
Simon Thum

15

สำหรับทุกคนที่มาที่นี่เพื่อแทนที่คำสั่ง entrypoint AND เพื่อส่งคำสั่งอื่นเช่นรัน bash แทนที่จะเป็นสคริปต์จุดเข้าใช้งานจากนั้นเรียกใช้คำสั่งอื่นที่มีพารามิเตอร์ (ไม่ชัดเจนสำหรับฉันจากคำตอบอื่น):

 docker run [other options] --entrypoint '/bin/sh' $IMAGE -c 'npm link gulp gulp-sass gulp-sourcemaps'

-c 'npm link ...'เป็นพารามิเตอร์สำหรับ/bin/shที่นี่คุณอาจผ่านคำสั่งใด ๆ ที่คุณต้องการที่จะทำงานในภาชนะ /bin/shสำหรับภาพอัลไพน์/bin/bashมักเป็นภาพอื่น ๆ


1
เพียงแค่คำสั่งเชลล์ addtion ควรเป็นคำสั่งแบบ json ดังนั้นแทนที่จะอ้างอิงด้วยเครื่องหมายคำพูดเดี่ยว'...'ใช้อัญประกาศคู่"..."
Jimmy Obonyo Abor

หรือเพียงแค่ส่งผ่าน - ข้อโต้แย้งร่วมกันมากเท่าที่คุณต้องการ
Nick Roz

สิ่งนี้ดูเหมือนจะไม่ทำงาน: "exec: \" - c \ ": ไม่พบไฟล์ปฏิบัติการใน $ PATH": ไม่ทราบ
ริชาร์ด

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