docker run -it flag คืออะไร?


118

ฉันกำลังทำบางสิ่งที่ซับซ้อนกับนักเทียบท่า แต่ปรากฎว่าฉันไม่รู้ว่า-itธงหมายถึงอะไร เมื่อเร็ว ๆ นี้ฉันได้เจอกับตัวอย่างdocker runคำสั่งที่ทำให้ฉันสับสนเล็กน้อย

docker run -itd ubuntu:xenial /bin/bash 

คำถามของฉันคืออะไรคือสิ่งที่ควรเขียน-itแฟล็กที่นี่หากคอนเทนเนอร์ระหว่างการรันbin/bash

ในเอกสารประกอบเรามีตัวอย่าง

docker run --name test -it debian

พร้อมคำอธิบาย

-it สั่งให้ Docker จัดสรร pseudo-TTY ที่เชื่อมต่อกับ stdin ของคอนเทนเนอร์ การสร้าง bash shell แบบโต้ตอบในคอนเทนเนอร์

และคำอธิบายสำหรับแฟล็ก -t จากหน้าวิธีใช้

-t, --tty จัดสรร pseudo-TTY

ถ้าฉันลบ -it แฟล็กระหว่าง

docker run -d ubuntu:xenial /bin/bash

คอนเทนเนอร์ที่สร้างขึ้นใหม่ของฉันไม่ได้อยู่มากนัก

ใน docker ps -a

มันถูกกำหนดให้ออก

ขออภัยหากคำถามของฉันค่อนข้างโง่ฉันไม่พบคำอธิบายบนอินเทอร์เน็ต (ฉันมีความเข้าใจผิดอย่างมากในประเด็นนั้น)


หาก/bin/bashไม่มีเนื้อหาใน stdin แสดงว่าไม่มีคำสั่งให้รันและไม่มีวิธีแจ้งผู้ใช้ดังนั้นจึงออก นี่เป็นพฤติกรรมปกติและเป็นที่คาดหวัง 100%
Charles Duffy

คำตอบ:


105

-itย่อมาจากคำสั่งนี้--interactive + --ttyเมื่อคุณdocker runใช้คำสั่งนี้ .. มันจะพาคุณเข้าไปข้างในคอนเทนเนอร์โดยตรงโดยที่-dสั้น--detachซึ่งหมายความว่าคุณแค่เรียกใช้คอนเทนเนอร์จากนั้นแยกออกจากนั้นโดยทั่วไปคุณจะเรียกใช้คอนเทนเนอร์ในพื้นหลัง .. แก้ไข:ดังนั้น หากคุณเรียกใช้คอนเทนเนอร์นักเทียบท่าด้วย-itdมันจะเรียกใช้-itตัวเลือกและแยกคุณออกจากคอนเทนเนอร์ดังนั้นคอนเทนเนอร์ของคุณจึงยังคงทำงานอยู่เบื้องหลังแม้ว่าจะไม่มีแอปเริ่มต้นใด ๆ ให้เรียกใช้ ..


ไม่ใช่คำตอบที่ถูกต้องเพราะคอนเทนเนอร์ของฉันหยุดทำงานหลังจากทำงานโดยไม่มีตัวเลือก -it
Alex

1
นั่นหมายความว่ามีข้อผิดพลาดในคอนเทนเนอร์ของคุณ .. ดังนั้นคอนเทนเนอร์ของคุณจึงไม่สามารถเริ่มทำงานได้ ... หรือบางทีอาจไม่มีCMDคำสั่งใด ๆตามค่าเริ่มต้นดังนั้นจึงไม่ได้เรียกใช้แอปใด ๆ ตามค่าเริ่มต้น ดังนั้นถ้าคุณเรียกใช้ในพื้นหลังมันจะออกทันทีเพราะไม่มีงานให้ทำ .
Fendi jatmiko

@Alex หากโปรแกรมในคอนเทนเนอร์ของคุณเป็นสิ่งที่ออกเมื่อ stdin ถูกปิดมีคำตอบของคุณ (ว่าทำไมมันถึงไม่ทำงานโดยไม่มี-i) ในทำนองเดียวกันถ้ามันจะทำงานคำสั่งที่ประพฤติแตกต่างไปตามว่ามี TTY -tคุณจะได้รับพฤติกรรมที่แตกต่างกันไปขึ้นอยู่กับการปรากฏตัวของ
Charles Duffy

1
@ Alex, ... และเพื่อความชัดเจนให้/bin/bash </dev/nullออกทันทีเช่นกันหากคุณเรียกใช้โดยไม่ใช้ Docker การทำงานdocker runโดยไม่-iทำสิ่งเดียวกันกับสำเนาbashที่เริ่มต้น (หากไม่มี-tก็มี stdin แต่ไม่ใช่ TTY ดังนั้นจึงไม่พบว่าตัวเองเป็นเชลล์แบบโต้ตอบดังนั้นคุณจะได้รับชุดพฤติกรรมที่แตกต่างกันเล็กน้อย)
Charles Duffy

1
@ AdmiralAdama สิ่งที่แก้ไขปัญหาสีคือตัวเลือก -t ต้องใช้ TTY เพื่อทำความเข้าใจกับโทเค็นสี
kroiz

45

docker run -it ubuntu:xenial /bin/bashเริ่มคอนเทนเนอร์ในโหมดโต้ตอบ (ด้วยเหตุนี้-itแฟล็ก) ที่อนุญาตให้คุณโต้ตอบกับ/bin/bashคอนเทนเนอร์ ซึ่งหมายความว่าตอนนี้คุณจะมีbashเซสชั่นภายในภาชนะเพื่อให้คุณสามารถls, mkdirหรือทำคำสั่งทุบตีใด ๆ ภายในภาชนะ

ที่สำคัญคือคำว่า "โต้ตอบ" หากคุณละเว้นแฟล็กคอนเทนเนอร์จะยังคงดำเนินการ/bin/bashแต่จะออกทันที ด้วยแฟล็กคอนเทนเนอร์จะดำเนินการ/bin/bashจากนั้นอดทนรอสำหรับข้อมูลที่คุณป้อน


2
สำหรับสิ่งที่ฉันต้องใช้ -t flag แล้ว? docker run -i ubuntu:xenial /bin/bash
Alex

4
-t: pseudo tty หรือ "pseudo terminal" หากไม่มีเทอร์มินัลคุณจะไม่สามารถส่งอินพุตไปยังคอนเทนเนอร์ได้
dvnguyen

docker run -it ubuntu:xenial ขอบคุณสำหรับคำตอบ แต่ฉันจะมีเซสชันเทอร์มินัลพร้อมคำสั่งนี้ตั้งแต่เริ่มต้นด้วย (สำหรับสิ่งที่ฉันต้องเรียกใช้ bin / bash แล้ว) นอกจากนี้ยังสร้างเซสชันเทอร์มินัล
Alex

3
คุณพูดถูก ฉันจะกลับคำพูดของฉัน หากไม่มี-tแท็กก็ยังสามารถโต้ตอบกับคอนเทนเนอร์ได้ แต่คุณจะมีเทอร์มินัลคุณสมบัติที่ดีกว่า คุณสามารถวิ่งด้วย-iและด้วย-itเพื่อดูความแตกต่าง
dvnguyen

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