วัตถุประสงค์ของ "นักสร้างสร้าง - ลาก" คืออะไร


17

docker build .เมื่อมีการสร้างภาพนักเทียบท่าปกติคุณใช้

แต่ฉันพบว่าคุณสามารถระบุ--pullได้ดังนั้นคำสั่งทั้งหมดจะมีลักษณะdocker build --pull .

--pullผมไม่แน่ใจว่าเกี่ยวกับวัตถุประสงค์ของ เอกสารอย่างเป็นทางการของ Dockers กล่าวว่า "พยายามดึงภาพเวอร์ชันที่ใหม่กว่าเสมอ" และฉันไม่แน่ใจว่าสิ่งนี้มีความหมายอย่างไรในบริบทนี้

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

ฉันคาดหวังว่าบางสิ่งบางอย่าง "ง่าย" เช่นนี้จะพบได้ง่ายบนเว็บ แต่ดูเหมือนจะไม่มีใครมีคำถามคล้ายกันกับคำถามนี้ การตีที่แท้จริงใน google หมายถึงเอกสารทางการของ Dockers ซึ่งฉัน (ตามที่ระบุไว้ด้านบน) ไม่เข้าใจ

ขอบคุณสำหรับความช่วยเหลือของคุณ!

คำตอบ:


17

มันจะดึงเวอร์ชันล่าสุดของภาพฐานใด ๆ แทนที่จะนำสิ่งที่คุณติดแท็กกลับมาใช้ซ้ำ

ยกตัวอย่างรูปภาพตามแท็กที่เคลื่อนไหว (เช่นubuntu:bionic) อัปสตรีมทำการเปลี่ยนแปลงและสร้างใหม่เป็นระยะ แต่คุณอาจมีภาพเก่าหนึ่งเดือนในเครื่อง นักเทียบท่าอย่างมีความสุขจะสร้างกับฐานเก่า --pullจะดึงเป็นเอฟเฟกต์ด้านข้างเพื่อให้คุณสร้างภาพฐานล่าสุด

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


นี่เป็นคำอธิบายที่ดีมากเกี่ยวกับubuntu:bionicภาพเนื่องจาก (ชัด) ไม่มีรุ่นที่แนบมา แต่จะยังคงแตกต่างกันเมื่อใดก็ตามที่พวกเขาเผยแพร่ภาพใหม่ ทั้งหมดทำให้รู้สึก ขอบคุณ!
Jim Aho

1
หากภาพฐานจะเป็นubuntu:0.1.0เช่นนั้นและพวกเขาเผยแพร่ภาพใหม่ แต่ด้วยรุ่นเดียวกันคือ ubuntu:0.1.0- นี่หมายความว่าdocker build --pullจะดาวน์โหลดภาพใหม่ทั้งหมดอีกครั้ง? (ซึ่งจะเป็นสิ่งที่คนส่วนใหญ่ต้องการฉันเดา)
จิม Aho

ฉันหวังว่าจะมีใครซักคนตอบคำถามสุดท้ายจาก @JimAho เพราะนั่นคือสิ่งที่ฉันต้องการเข้าใจด้วย หากรูปภาพเพิ่งถูกผลักและไม่มีอะไรเปลี่ยนแปลงมันเป็นกรณีที่ไม่ถูกสร้างขึ้นมาใหม่หรือไม่?
learning2learn

2
@ learning2learn คำตอบคือใช่แท็กของรูปภาพนักเทียบท่าเป็นเพียงสตริงดังนั้น "0.1.0" จึงไม่แตกต่างจากตัวอย่างในคำตอบ "bionic"
Anthony Sottile

@AnthonySottile ขอบคุณ เป็นอย่างมาก.
learning2learn

1

คำตอบง่ายๆ docker buildถูกใช้เพื่อสร้างจาก local dockerfile docker pullถูกใช้เพื่อดึงจากศูนย์กลางนักเทียบท่า ถ้าคุณใช้ตัวสร้างนักเทียบท่าที่ไม่มีไฟล์ตัวเทียบมันจะเกิดข้อผิดพลาด

เมื่อคุณระบุ--pullหรือ:latestนักเทียบท่าจะพยายามดาวน์โหลดเวอร์ชันใหม่ล่าสุด (ถ้ามี)

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


หากคุณมีภาพชั้น - มันจะดึงทั้งหมดของพวกเขาเสมอ ?
Jim Aho

หากคุณมีรูปภาพที่มีเลเยอร์ภาพบางส่วนจะถูกเก็บไว้ในเครื่อง (เลเยอร์ที่เก่ากว่า) และจะดึงเลเยอร์ใหม่ใด ๆ
DuDoff

0

เทียบท่าช่วยให้ผ่าน  --pull ธง  เช่นdocker build docker build . --pull -t myimageนี่เป็นวิธีที่แนะนำเพื่อให้แน่ใจว่าบิลด์จะใช้อิมเมจคอนเทนเนอร์ล่าสุดเสมอแม้ว่าจะมีเวอร์ชันที่ให้บริการในเครื่องก็ตาม อย่างไรก็ตามหนึ่งจุดเพิ่มเติมมูลค่าการกล่าวขวัญ:

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

--no-cache - สิ่งนี้จะบังคับให้สร้างเลเยอร์ใหม่ที่มีอยู่แล้ว

คำสั่งเต็มจะมีลักษณะเช่นนี้:

docker build . --pull --no-cache --tag myimage:version

มีตัวเลือกเดียวกันสำหรับdocker-compose:

docker-compose build --no-cache --pull


--no-cacheในการใช้งานปกติคุณไม่ควรต้อง หากภาพฐานมีการปรับปรุง (และ--pullรับรุ่นใหม่) ที่ทำให้แคชใช้ไม่ได้โดยอัตโนมัติ ในทำนองเดียวกันหากคุณใช้COPYรหัสอื่นที่จะทำให้แคชใช้ไม่ได้ สิ่งเดียวที่มักจะเกิดขึ้นคือถ้าคุณทำบางสิ่งบางอย่างเช่นapt-get installแพ็คเกจโฮสต์บนเครือข่ายซึ่งในกรณีนี้--no-cacheจะทำให้ตรวจสอบเวอร์ชันที่ใหม่กว่าแม้ว่าภาพฐานจะไม่ได้อัปเดต
David Maze
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.