นักเทียบท่าจะรันข้อกำหนด pip.txt เฉพาะเมื่อมีการเปลี่ยนแปลงหรือไม่


98

ใน Dockerfile ฉันมีเลเยอร์ที่ติดตั้งrequirements.txt:

FROM python:2.7
RUN pip install -r requirements.txt

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

ฉันจะแน่ใจได้อย่างไรว่า Docker ทำงานเฉพาะpip install -r requirements.txtเมื่อมีการเปลี่ยนแปลงไฟล์เท่านั้น

Removing intermediate container f98c845d0f05
Step 3 : RUN pip install -r requirements.txt
 ---> Running in 8ceb63abaef6
Collecting https://github.com/tomchristie/django-rest-framework/archive/master.zip (from -r requirements.txt (line 30))
  Downloading https://github.com/tomchristie/django-rest-framework/archive/master.zip
Collecting Django==1.8.7 (from -r requirements.txt (line 1))

1
กรุณาโพสต์ผลลัพธ์ของdocker build(และของคุณDockerfile) สันนิษฐานว่าเป็นขั้นตอนก่อนหน้าในกระบวนการสร้างของคุณที่ทำให้แคชหยุดทำงานทำให้ขั้นตอนนี้ทำงาน
Thomas Orozco

อัปเดต OP กับทั้งหมดที่ฉันมีในขณะนี้
Prometheus

1
แค่ขั้นตอนนี้ไม่มีประโยชน์ กรุณาโพสต์ผลลัพธ์ที่สมบูรณ์ (หรืออย่างน้อย Dockerfile)
Thomas Orozco

คำตอบ:


179

ฉันสมมติว่า ณ จุดหนึ่งในกระบวนการสร้างของคุณคุณกำลังคัดลอกแอปพลิเคชันทั้งหมดของคุณไปยังอิมเมจ Docker ด้วยCOPYหรือADD:

COPY . /opt/app
WORKDIR /opt/app
RUN pip install -r requirements.txt

ปัญหาคือคุณกำลังทำให้ Docker build cache ไม่ถูกต้องทุกครั้งที่คุณคัดลอกแอปพลิเคชันทั้งหมดลงในอิมเมจ นอกจากนี้ยังจะทำให้แคชเป็นโมฆะสำหรับขั้นตอนการสร้างที่ตามมาทั้งหมด

เพื่อป้องกันสิ่งนี้ขอแนะนำให้คัดลอกเฉพาะrequirements.txtไฟล์ในขั้นตอนการสร้างแยกต่างหากก่อนที่จะเพิ่มแอปพลิเคชันทั้งหมดลงในรูปภาพ:

COPY requirements.txt /opt/app/requirements.txt
WORKDIR /opt/app
RUN pip install -r requirements.txt
COPY . /opt/app
# continue as before...

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


8
ในฐานะที่เป็นแนวทางทั่วไปผมเชื่อว่าCOPYเป็นที่ต้องการมากกว่าโดยเฉพาะถ้าคุณต้องการลักษณะการทำงานของADD ADD
Metropolis

2
@ มหานครคุณถูกต้องทั้งหมด ขอบคุณสำหรับคำใบ้
helmbert

5
เห็นด้วยกับ @Metropolis ADDจำเป็นเฉพาะในกรณีที่<src>โฟลเดอร์มีไฟล์เก็บถาวรใด ๆ ที่จำเป็นต้องคลายแพ็กหรือจำเป็นต้องรองรับการจัดการ URL ระยะไกล {source code}
Mohsin

45

สิ่งนี้กล่าวถึงโดยตรงใน " แนวทางปฏิบัติที่ดีที่สุดสำหรับการเขียน Dockerfiles " ของนักเทียบท่า:

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

ตัวอย่างเช่น:

COPY requirements.txt /tmp/
RUN pip install --requirement /tmp/requirements.txt
COPY . /tmp/

ส่งผลให้แคชไม่ถูกต้องสำหรับขั้นตอน RUN น้อยกว่าถ้าคุณใส่ COPY / tmp / ก่อนหน้านั้น


0

อีกวิธีหนึ่งคือวิธีที่เร็วกว่าในการเรียกใช้ไฟล์ requirements.txt โดยไม่ต้องพิมพ์ "ใช่" เพื่อยืนยันการติดตั้งไลบรารีคุณสามารถเขียนใหม่เป็น:

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