วิธีการทำให้นักเทียบท่าประกอบสร้างคอนเทนเนอร์ใหม่จากอิมเมจใหม่เสมอ


200

ภาพนักเทียบท่าของฉันถูกสร้างขึ้นบนเซิร์ฟเวอร์ Jenkins CI และถูกส่งไปยัง Docker Registry ส่วนตัวของเรา เป้าหมายของฉันคือการจัดเตรียมสภาพแวดล้อมด้วยตัวจัดเรียงซึ่งเริ่มต้นสถานะภาพที่สร้างไว้เสมอ

ขณะนี้ฉันกำลังใช้นักเทียบท่า - เขียน 1.3.2 และ 1.4.0 บนเครื่องที่แตกต่างกัน แต่เรายังใช้รุ่นเก่ากว่านี้ก่อนหน้านี้

ฉันมักจะใช้docker-compose pull && docker-compose up -dคำสั่งเพื่อดึงภาพสดจากรีจิสทรีและเริ่มต้นขึ้น ฉันเชื่อว่าพฤติกรรมที่ฉันชอบนั้นทำงานได้ตามที่คาดไว้จนถึงจุดหนึ่ง แต่หลังจากนั้นก็docker-compose upเริ่มที่จะเรียกใช้คอนเทนเนอร์ที่หยุดทำงานก่อนหน้านี้แทนการเริ่มสร้างภาพที่สร้างขึ้นทุกครั้ง

มีวิธีกำจัดพฤติกรรมนี้หรือไม่? เป็นไปได้ไหมที่จะเชื่อมต่อในไฟล์กำหนดค่า docker-compose.yml เพื่อไม่พึ่งพา "ไม่ลืม" บางอย่างในบรรทัดคำสั่งในทุกการเรียกใช้

PS นอกจากการหาวิธีเพื่อให้บรรลุเป้าหมายของฉันฉันก็อยากจะรู้มากขึ้นเกี่ยวกับพื้นหลังของพฤติกรรมนี้ ฉันคิดว่าความคิดพื้นฐานของ Docker คือการสร้างโครงสร้างพื้นฐานที่ไม่เปลี่ยนแปลง พฤติกรรมปัจจุบันของนักเทียบท่าแต่งดูเหมือนจะขัดแย้งกันธรรมดากับวิธีนี้ .. หรือฉันจะพลาดบางจุดที่นี่?

คำตอบ:


234

docker-compose up --force-recreateเป็นตัวเลือกหนึ่ง แต่ถ้าคุณใช้มันสำหรับ CI ฉันจะเริ่มต้นบิลด์ด้วยdocker-compose rm -fเพื่อหยุดและลบคอนเทนเนอร์และโวลุ่ม (จากนั้นทำตามด้วยการดึงขึ้น)

นี่คือสิ่งที่ฉันใช้:

docker-compose rm -f
docker-compose pull
docker-compose up --build -d
# Run some tests
./tests
docker-compose stop -t 1

เหตุผลที่สร้างคอนเทนเนอร์ใหม่นั้นคือการเก็บรักษาโวลุ่มข้อมูลใด ๆ ที่อาจถูกใช้ (และมันก็เกิดขึ้นเพื่อทำให้upเร็วขึ้นมาก)

หากคุณกำลังทำ CI คุณไม่ต้องการสิ่งนั้นดังนั้นเพียงลบทุกสิ่งที่ควรจะได้รับตามที่คุณต้องการ

อัปเดต: ใช้up --buildซึ่งเพิ่มเข้ามาในdocker-compose1.7


1
ใช่จริง ๆ แล้วนี่คือสิ่งที่ฉันทำใน CI เช่นกัน ไม่แน่ใจว่าทำไมฉันถึงไม่พูดถึงเรื่องนั้น ...
Adrian Mouat

@dnephin docker-compose run -dไม่มีอยู่จริงหรือ คุณต้องการที่จะพูดdocker-compose up -dหรือไม่?
Guillaume Vincent

2
ถ้าคุณวิ่งdocker-compose pullก่อนdocker-compose rm -fคุณสามารถประหยัดเวลาได้มากขึ้น
stephanlindauer

2
แฟล็ก -d ที่ท้ายจะทำอะไร?
เดวิดเจเดวิส

3
"-d โหมดเดี่ยว: เรียกใช้คอนเทนเนอร์ในพื้นหลัง"
dnephin

137

ทางออกเดียวที่ได้ผลสำหรับฉันคือคำสั่งนี้:

docker-compose build --no-cache

สิ่งนี้จะดึงภาพสดจาก repo โดยอัตโนมัติและจะไม่ใช้รุ่นแคชที่สร้างไว้ล่วงหน้าด้วยพารามิเตอร์ใด ๆ ที่คุณเคยใช้มาก่อน


1
นอกจากนี้ภายใต้ Windows 10 มันสามารถช่วยในการตั้งค่าเซิร์ฟเวอร์ DNS ในการตั้งค่าจากอัตโนมัติเป็นคงที่หรือจากคงที่เป็นอัตโนมัติ
qräbnö

2
ทำงานให้ฉันบน OS X อาคารที่มีนักเทียบท่า-comopse รุ่น 2
RoboBear

1
ทำงานบน OS X docker
HelloWorld

56

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

docker-compose down

จากนั้นหากคุณมีการเปลี่ยนแปลงใหม่ ๆ เกี่ยวกับรูปภาพหรือ Dockerfiles ของคุณให้ใช้:

docker-compose build --no-cache

สุดท้าย:docker-compose up

ในหนึ่งคำสั่ง: docker-compose down && docker-compose build --no-cache && docker-compose up


2
docker-compose build --no-cacheจำเป็นเฉพาะเมื่อมีการเปลี่ยนแปลงใน Dockerfiles
Victor Timoftii

แท้จริงแล้ววิกเตอร์ ขอบคุณ! ฉันคิดว่ามันจำเป็นเช่นกันหลังจากอัพเดตโมดูล / แอ็พพลิเคชันที่ถูกเรียกใช้เมื่อคอนเทนเนอร์เริ่มทำงาน สำหรับกรณีเหล่านี้ก่อนที่จะใช้เป็นสิ่งจำเป็นในการสร้างบริการที่มีdocker-compose up docker-compose build
ivanleoncz

18

คุณสามารถส่ง--force-recreateต่อไปยังdocker compose upซึ่งควรใช้ภาชนะบรรจุที่สดใหม่

ฉันคิดว่าเหตุผลในการนำภาชนะกลับมาใช้ใหม่คือการรักษาการเปลี่ยนแปลงในระหว่างการพัฒนา โปรดทราบว่าการเขียนทำสิ่งที่คล้ายกับปริมาณซึ่งจะยังคงอยู่ระหว่างการพักผ่อนหย่อนใจภาชนะ (ภาชนะที่สร้างขึ้นใหม่จะแนบไปกับปริมาณของรุ่นก่อน) สิ่งนี้มีประโยชน์เช่นถ้าคุณมี Redis container ที่ใช้เป็นแคชและคุณไม่ต้องการสูญเสียแคชทุกครั้งที่คุณทำการเปลี่ยนแปลงเล็กน้อย ในบางครั้งมันแค่สับสน

ฉันไม่เชื่อว่ามีวิธีใดที่คุณสามารถบังคับได้จากไฟล์เขียน

เนื้อหามันขัดแย้งกับหลักการโครงสร้างพื้นฐานที่ไม่เปลี่ยนแปลง ข้อโต้แย้งอาจเป็นไปได้ว่าคุณไม่ได้ใช้ Compose ในการผลิต (ยัง) นอกจากนี้ฉันไม่แน่ใจว่าฉันยอมรับว่า infra ที่ไม่เปลี่ยนรูปเป็นแนวคิดพื้นฐานของ Docker ถึงแม้ว่ามันจะเป็นจุดใช้งาน / จุดขายที่ดีแน่นอน


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

8
--force-recreateไม่ทำงานสำหรับฉัน ... ภาพที่ไม่ได้ดึงแม้ว่าจะเป็นรุ่นใหม่ที่จะออกมี ...
Lisak

1
@ เงียบฉันไม่เคยบอกว่ามันดึงภาพใหม่ มันไม่ได้ มันเพิ่งเริ่มภาชนะใหม่โดยใช้ภาพที่มีอยู่ในเครื่อง คุณจะต้องเรียกใช้ตัวดึงนักเทียบท่าด้วยตนเอง
Adrian Mouat

3
docker-compose up --build

หรือ

docker-compose build --no-cache

1
เมื่อเป็นไปได้โปรดใช้ความพยายามในการให้คำอธิบายเพิ่มเติมแทนที่จะเป็นรหัส คำตอบดังกล่าวมีแนวโน้มที่จะมีประโยชน์มากขึ้นเพราะพวกเขาช่วยสมาชิกของชุมชนและโดยเฉพาะอย่างยิ่งนักพัฒนาใหม่เข้าใจถึงเหตุผลของการแก้ปัญหาและสามารถช่วยป้องกันไม่ให้ต้องตอบคำถามติดตาม
Rajan

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