ตอบช้า แต่อาจช่วยใครซักคน
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 เช่นปิดบังอินพุตหรือระบายสีเอาท์พุท