ตอบช้า แต่อาจช่วยใครซักคน
docker run/exec -iจะเชื่อมต่อ STDIN ของคำสั่งภายในคอนเทนเนอร์กับ STDIN ของdocker run/execตัวเอง
ดังนั้น
- docker run -i alpine catช่วยให้คุณมีบรรทัดว่างรอการป้อนข้อมูล พิมพ์ "สวัสดี" คุณจะได้รับเสียงสะท้อน "สวัสดี" ภาชนะที่จะไม่ออกจนกว่าคุณจะส่ง CTRL + D เพราะกระบวนการหลักคือการรอคอยสำหรับการป้อนข้อมูลจากกระแสอนันต์ที่มีการป้อนข้อมูลที่ขั้วของ- cat- docker run
- ในทางกลับกันecho "hello" | docker -i run alpine catจะพิมพ์ "hello" และออกทันทีเพราะcatสังเกตว่ากระแสข้อมูลได้สิ้นสุดลงและยุติตัวเอง
หากคุณลองdocker psหลังจากออกจากข้อใดข้อหนึ่งข้างต้นคุณจะไม่พบคอนเทนเนอร์ที่ใช้งานอยู่ ในทั้งสองกรณี,catตัวเองได้ยกเลิกดังนั้นนักเทียบท่าได้ยกเลิกภาชนะ
ตอนนี้สำหรับ "-t" นี่จะบอกกระบวนการหลักภายในตัวเทียบท่าว่าอินพุตเป็นอุปกรณ์เทอร์มินัล
ดังนั้น
- docker run -t alpine catจะให้บรรทัดว่าง แต่ถ้าคุณพยายามพิมพ์ "hello" คุณจะไม่ได้เสียงสะท้อนใด ๆ นี่เป็นเพราะขณะที่- catเชื่อมต่อกับอินพุตเทอร์มินัลอินพุตนี้ไม่ได้เชื่อมต่อกับอินพุตของคุณ "Hello"- catที่คุณพิมพ์ไม่ถึงการป้อนข้อมูลของ- catกำลังรออินพุตที่ไม่เคยมาถึง
- echo "hello" | docker run -t alpine catจะให้บรรทัดว่างกับคุณและจะไม่ออกจากคอนเทนเนอร์บน CTRL-D แต่คุณจะไม่ได้รับเสียงสะท้อน "สวัสดี" เพราะคุณไม่ได้ผ่าน- -i
ถ้าคุณส่ง CTRL + C คุณจะได้เชลล์กลับมา แต่ถ้าลองdocker psตอนนี้คุณจะเห็นว่าcatคอนเทนเนอร์ยังคงทำงานอยู่ นี่เป็นเพราะcatยังรอสตรีมอินพุตที่ไม่เคยปิด ฉันไม่พบการใช้งานที่เป็นประโยชน์สำหรับ-t-iคนเดียวโดยไม่ต้องถูกรวมกับ
ตอนนี้เพื่อ-itร่วมกัน มันบอกแมวว่าอินพุตของมันเป็นขั้วและในเวลาเดียวกันเชื่อมต่อขั้วนี้กับอินพุตdocker runซึ่งเป็นขั้ว docker run/execจะให้แน่ใจว่าการป้อนข้อมูลของตัวเองในความเป็นจริง TTY catก่อนที่จะผ่านไปยัง นี่คือเหตุผลที่คุณจะได้รับinput device is not a TTYถ้าคุณลองecho "hello" | docker run -it alpine catเพราะในกรณีนี้อินพุตของdocker runตัวเองเป็นไพพ์จากเสียงก้องก่อนหน้าและไม่ใช่เทอร์มินัลที่docker runทำงาน
ในที่สุดทำไมคุณจะต้องผ่าน-tหาก-iจะหลอกลวงการเชื่อมต่ออินพุตของคุณกับcatอินพุตของ นี่เป็นเพราะคำสั่งจัดการอินพุตต่างกันหากเป็นเทอร์มินัล นี่เป็นตัวอย่างที่ดีที่สุด
- docker run -e MYSQL_ROOT_PASSWORD=123 -i mariadb mysql -uroot -pจะให้พรอมต์รหัสผ่านแก่คุณ หากคุณพิมพ์รหัสผ่านอักขระจะถูกพิมพ์อย่างชัดเจน
- docker run -i alpine shจะให้บรรทัดที่ว่างกับคุณ หากคุณพิมพ์คำสั่งเช่น- lsคุณได้รับผลลัพธ์ แต่คุณจะไม่ได้รับพรอมต์หรือสีที่ส่งออก
ในสองกรณีสุดท้ายคุณจะได้รับพฤติกรรมนี้เพราะmysqlเช่นเดียวกับที่shellไม่ได้รับการรักษาอินพุตเป็น tty และดังนั้นจึงไม่ได้ใช้พฤติกรรมที่เฉพาะเจาะจง tty เช่นปิดบังอินพุตหรือระบายสีเอาท์พุท