นักเทียบท่าวิ่ง: ทำไมต้องใช้ --rm (นักเทียบท่ามือใหม่)


114

ฉันกำลังลองเทียบท่าเป็นครั้งแรกและยังไม่มี "แบบจำลองทางจิต" ผู้เริ่มต้นทั้งหมด

ตัวอย่างทั้งหมดที่ฉันกำลังดูมี--rmแฟล็กที่จะเรียกใช้เช่น

docker run -it --rm ...
docker container run -it --rm ...

คำถาม:

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

ดังนั้นฉันรู้ว่าฉันมีความคิดที่ผิดเกี่ยวกับนักเทียบท่า


6
--rmลบคอนเทนเนอร์ที่หยุด (ที่docker runสร้างขึ้น) ไม่ใช่ภาพที่ขึ้นอยู่กับ (สิ่งที่คุณดาวน์โหลด)
Ry-

docker run --helpน่าจะมีประโยชน์ หากคุณไม่ต้องการนำคอนเทนเนอร์ออกคุณสามารถส่งผ่านได้
indapublic

1
มันต้องเป็น--rmและมันจะล้างคอนเทนเนอร์โดยอัตโนมัติและลบระบบไฟล์เมื่อคอนเทนเนอร์ออกและไม่ได้หมายความว่าจะเอาของออกจากคอนเทนเนอร์
Mahattam

2
คุณไม่ได้ดาวน์โหลดคอนเทนเนอร์คุณดาวน์โหลดรูปภาพ อ่านที่นี่เพื่อเรียนรู้ความแตกต่างระหว่างรูปภาพและคอนเทนเนอร์: docs.docker.com/engine/docker-overview/#docker-objects
axiac

คำตอบ:


101

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

คุณควรถือว่าคอนเทนเนอร์เป็นตัวอย่างของแอปพลิเคชันของคุณ แต่แอปพลิเคชันของคุณถูกฝังลงในรูปภาพ การใช้งานที่เหมาะสมคือการสร้างรูปภาพที่กำหนดเองซึ่งคุณฝังไฟล์การกำหนดค่าตัวแปรสภาพแวดล้อมและอื่น ๆ ทั้งหมดลงในรูปภาพ อ่านเพิ่มเติมเกี่ยวกับ Dockerfile และวิธีดำเนินการได้ที่นี่

เมื่อคุณทำเช่นนั้นคุณจะมีภาพที่มีทุกอย่างและในการใช้แอปพลิเคชันของคุณคุณเพียงแค่เรียกใช้ภาพด้วยการตั้งค่าพอร์ตที่เหมาะสมหรือตัวแปรไดนามิกอื่น ๆ docker run <your-image>

การเรียกใช้คอนเทนเนอร์ที่มี--rmแฟล็กนั้นดีสำหรับคอนเทนเนอร์ที่คุณใช้เป็นเวลาสั้น ๆ ในขณะที่เพียงเพื่อทำบางสิ่งให้สำเร็จเช่นรวบรวมแอปพลิเคชันของคุณภายในคอนเทนเนอร์หรือเพียงแค่ทดสอบสิ่งที่ใช้งานได้จากนั้นคุณจะรู้ว่ามันเป็นคอนเทนเนอร์ที่มีอายุสั้นและคุณ บอก Docker daemon ของคุณว่าเมื่อรันเสร็จแล้วให้ลบทุกอย่างที่เกี่ยวข้องและประหยัดเนื้อที่ดิสก์


การส่งผ่านตัวแปรสภาพแวดล้อมไปยังนักเทียบท่าจะเป็นทางเลือกที่ดีกว่า ด้วยวิธีนี้คุณสามารถเริ่มต้นด้วยการกำหนดค่าต่างๆ (เช่นการผลิตเทียบกับก่อนการผลิตจริง)?
SCO

สภาพแวดล้อม Prod vs Test เป็นตัวอย่างที่ดีที่คุณอาจต้องการใช้ env vars เพื่อทำการแยกและทำให้แอปของคุณทำงานจากภาพเดียวกัน แต่มีการตั้งค่าที่แตกต่างกันสำหรับแต่ละ env
buddy123

มีวิธีลบคอนเทนเนอร์ที่เริ่มใช้โดยอัตโนมัติ--rmเมื่อผู้ใช้ปิดหน้าต่างเทอร์มินัลหรือไม่ กล่าวคือไม่จงใจเรียกใช้exitในเชลล์คอนเทนเนอร์ แต่เพียงแค่ปิดหน้าต่างเทอร์มินัล GUI ฉันสังเกตว่าคอนเทนเนอร์จะไม่ถูกลบในกรณีนี้
venkrao

20

แฟล็ก--rmถูกใช้เมื่อคุณต้องการให้ลบคอนเทนเนอร์หลังจากที่งานเสร็จสมบูรณ์

เหมาะสำหรับการทดสอบขนาดเล็กหรือวัตถุประสงค์ของ POC และช่วยประหยัดอาการปวดหัวในการเก็บบ้าน


16

จากhttps://docs.docker.com/engine/reference/run/#clean-up---rm

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

กล่าวโดยย่อคือการรักษาความสะอาดของโฮสต์จากภาชนะที่หยุดและไม่ได้ใช้งาน


1

ฉันใช้--rmเมื่อเชื่อมต่อกับคอนเทนเนอร์ที่รันเพื่อดำเนินการบางอย่างเช่นการสำรองฐานข้อมูลหรือการคัดลอกไฟล์ นี่คือตัวอย่าง:

docker run -v $(pwd):/mnt --link app_postgres_1:pg --rm postgres:9.5 pg_dump -U postgres -h pg -f /mnt/docker_pg.dump1 app_db

ข้างต้นจะเชื่อมต่อคอนเทนเนอร์ที่ใช้งานชื่อ 'app_postgres_1' และสร้างข้อมูลสำรอง เมื่อคำสั่งสำรองเสร็จสิ้นคอนเทนเนอร์จะถูกลบทั้งหมด

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