นักเทียบท่า: เพิ่มนโยบายการเริ่มระบบใหม่ไปยังคอนเทนเนอร์ที่สร้างขึ้นแล้ว


229

ฉันเห็นว่านักเทียบท่าได้เพิ่มสิ่งที่เรียกว่านโยบายการรีสตาร์ทเพื่อจัดการการรีสตาร์ทคอนเทนเนอร์ในกรณีเช่นรีบูต

ขณะนี้มีประโยชน์มากผมเห็นว่าคำสั่งนโยบายที่เริ่มต้นเพียงแค่ทำงานร่วมกับและไม่ได้docker run docker startดังนั้นคำถามของฉันคือ:

มีวิธีใดบ้างที่จะเพิ่มนโยบายการเริ่มระบบใหม่ไปยังคอนเทนเนอร์ที่สร้างไว้แล้วในอดีตหรือไม่?


คุณควรเปลี่ยนคำตอบที่ยอมรับเป็นคำตอบของ @Yale Huang คำตอบที่ยอมรับนั้นไม่ถูกต้องกับนักเทียบท่ารุ่นปัจจุบัน ฉันเข้าใจว่าคำตอบอาจช่วยคุณได้ แต่ตอนนี้มันทำให้เข้าใจผิด
Stepan Vavra

2
เสร็จสิ้น ขอบคุณสำหรับคำเตือน
Enrique Moreno Tent

คำตอบ:


574

ใน Docker เวอร์ชันล่าสุด (ตั้งแต่ 1.11) คุณมีupdateคำสั่ง:

docker update --restart=always <container>

9
ดูเหมือนว่าจะมีการเพิ่มใน Docker 1.11.0
phansen

@phansen: อันที่จริงมันเป็น
TachyonVortex

4
ควรเป็นคำตอบที่ได้รับการยอมรับโดยมีข้อแม้ว่าทำงานได้เหมือน Docker 1.11
JohnDoe

6
กับนักเทียบท่า 17.09 ฉันต้องเรียกใช้docker update --restart always <container> docs.docker.com/engine/admin/start-containers-automatically
HarlemSquirrel

4
docker updateยอมรับ ID คอนเทนเนอร์จำนวนมากดังนั้นไม่จำเป็นต้องxargsทำdocker update --restart=always $(docker ps -q)เลยเพียงแค่ทำ
markusk

49

มีสองวิธีในการแก้ไข RestartPolicy:

  • ค้นหา ID คอนเทนเนอร์หยุดบริการนักเทียบท่าทั้งหมดแก้ไข /var/lib/docker/containers/CONTAINER_ID/hostconfig.json ตั้งค่า RestartPolicy -> ชื่อเป็น "เสมอ" และเริ่มบริการนักเทียบท่า
  • docker commit คอนเทนเนอร์ของคุณเป็นรูปภาพใหม่หยุด & rm คอนเทนเนอร์ปัจจุบันและเริ่มคอนเทนเนอร์ใหม่ด้วยรูปภาพ

2
หยุดคอนเทนเนอร์แก้ไขเริ่มคอนเทนเนอร์ ทำงานเหมือนจับใจ ฉันไม่รู้ว่าทำไมการแก้ไขถูกปิดใช้งาน
หมอก

2
สุดท้ายคำตอบที่เหมาะสม :)
นาวิน

ทำงานกับฉันบนเซิร์ฟเวอร์เก่าที่มีตัวเชื่อมต่อ 1.10 (ไม่ต้องถาม😱) Sadly docker updateอนุญาตให้แก้ไขนโยบายการเริ่มต้นใหม่ในวันที่ 1.11+ เท่านั้น
Igor Kupczyński

1

การใช้--restart=alwaysนโยบายจะจัดการการรีสตาร์ทคอนเทนเนอร์ที่มีอยู่ในกรณีที่รีบูต

ปัญหาคือถ้ามีหลายคอนเทนเนอร์ด้วย--restart=alwaysเมื่อคุณเรียกใช้อิมเมจของเวอร์ชันที่ใหม่กว่าตามที่กล่าวไว้ในตัวเทียบท่า - คุณจะปิดการใช้งานรีสตาร์ทอัตโนมัติบนคอนเทนเนอร์ได้อย่างไร? .

พยายามที่จะเอาภาชนะโดยอัตโนมัติเมื่ออยู่โดยตัวเลือกใส่docker run --rmก็จะมีปัญหากับ--restart=always นโยบายตั้งแต่ที่พวกเขากำลังขัดแย้งกันของแต่ละคน

$ docker run --rm --restart always <image>
Conflicting options: --restart and --rm

ดังนั้นในกรณีนี้มันจะดีกว่าที่จะเลือกตัวเลือกอื่น: - เริ่มต้นใหม่ยกเว้น - หยุดนโยบาย

$ docker run --rm --restart unless-stopped <image>

นโยบายนี้จะไม่ขัดแย้งกันdocker run --rmแต่ที่อธิบายไว้ในเอกสารนักเทียบท่า :

ซึ่งคล้ายกับ--restart=alwaysยกเว้นว่าเมื่อคอนเทนเนอร์หยุดทำงาน (ด้วยตนเองหรืออย่างอื่น)จะไม่ถูกรีสตาร์ทแม้หลังจาก Docker daemon รีสตาร์ท

ดังนั้นเมื่อใช้--restart unless-stoppedนโยบายนี้เพื่อให้แน่ใจว่าการรีสตาร์ททำงานในกรณีที่หยุดโดยไม่ตั้งใจเมื่อคุณปิดเครื่องให้ทำหนึ่งครั้งในเทอร์มินัลอื่นดังนี้

$ docker ps
$ docker restart <container>

รอจนกว่ากระบวนการฆ่าจะจบลงในเชลล์ก่อนหน้าจากนั้นปิดและปล่อยทิ้งไว้ ( ไม่ต้องออก )
และตรวจสอบอีกครั้งในเทอร์มินัลที่เหลือหากคอนเทนเนอร์ยังทำงานอยู่:

$ docker ps

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

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