ฉันมีRUN
คำสั่งบางอย่างใน Dockerfile ที่ฉันต้องการเรียกใช้-no-cache
ทุกครั้งที่สร้างอิมเมจ Docker
ฉันเข้าใจว่าdocker build --no-cache
จะปิดใช้งานการแคชสำหรับ Dockerfile ทั้งหมด
เป็นไปได้หรือไม่ที่จะปิดการใช้งานแคชสำหรับคำสั่ง RUN เฉพาะ?
ฉันมีRUN
คำสั่งบางอย่างใน Dockerfile ที่ฉันต้องการเรียกใช้-no-cache
ทุกครั้งที่สร้างอิมเมจ Docker
ฉันเข้าใจว่าdocker build --no-cache
จะปิดใช้งานการแคชสำหรับ Dockerfile ทั้งหมด
เป็นไปได้หรือไม่ที่จะปิดการใช้งานแคชสำหรับคำสั่ง RUN เฉพาะ?
คำตอบ:
มีตัวเลือกเสมอในการแทรกคำสั่งที่ไม่มีความหมายและราคาถูกเพื่อรันก่อนภูมิภาคที่คุณต้องการปิดใช้งานแคช
ตามที่เสนอไว้ในความคิดเห็นของปัญหานี้เราสามารถเพิ่มบล็อกการสร้างอาร์กิวเมนต์ (ชื่อสามารถกำหนดเองได้):
ARG CACHEBUST=1
ก่อนภูมิภาคดังกล่าวและแก้ไขค่าของแต่ละการรันโดยการเพิ่ม--build-arg CACHEBUST=$(date +%s)
เป็นdocker build
อาร์กิวเมนต์ (ค่าสามารถกำหนดเองได้ในที่นี้คือวันที่และเวลาปัจจุบันเพื่อให้แน่ใจว่ามีความเป็นเอกลักษณ์ในการรัน)
แน่นอนว่าสิ่งนี้จะปิดการใช้งานแคชสำหรับบล็อกต่อไปนี้ทั้งหมดเช่นกันเนื่องจากผลรวมแฮชของรูปภาพกลางจะแตกต่างกันซึ่งทำให้แคชที่เลือกอย่างแท้จริงปิดใช้งานปัญหาที่ไม่สำคัญโดยคำนึงถึงวิธีการทำงานของนักเทียบท่าในปัจจุบัน
---> Using cache
อยู่ภายใต้บรรทัด `ʻARG CACHEBUST = 1` ของฉัน ... (และใช่ฉันทำ--build-arg CACHEBUST=$(date +%s)
ในคำสั่งนักเทียบท่าของฉัน)
RUN echo "$CACHEBUST"
เนื่องจากการใช้งานARG
จะไม่ทำให้แคชเป็นโมฆะ
ใช้
ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
ก่อนบรรทัด RUN ที่คุณต้องการเรียกใช้เสมอ ใช้งานได้เนื่องจาก ADD จะดึงไฟล์ / URL เสมอและ URL ด้านบนจะสร้างข้อมูลแบบสุ่มในแต่ละคำขอจากนั้น Docker จะเปรียบเทียบผลลัพธ์เพื่อดูว่าสามารถใช้แคชได้หรือไม่
ฉันได้ทดสอบสิ่งนี้ด้วยและใช้งานได้ดีเนื่องจากไม่ต้องการอาร์กิวเมนต์บรรทัดคำสั่ง Docker เพิ่มเติมและยังทำงานจากไฟล์ Docker-compose.yaml :)
ไม่โดยตรง แต่คุณสามารถแบ่ง Dockerfile ของคุณออกเป็นหลาย ๆ ส่วนสร้างภาพจากนั้นจากภาพนี้ที่จุดเริ่มต้นของ Dockerfile ถัดไปและสร้างภาพโดยมีหรือไม่มีการแคช
ตั้งแต่เดือนกุมภาพันธ์ 2559 ไม่สามารถทำได้
มีการร้องขอคุณลักษณะนี้ที่GitHub
คุณลักษณะนี้เพิ่มเมื่อสัปดาห์ที่แล้ว
ARG FOO=bar
FROM something
RUN echo "this won't be affected if the value of FOO changes"
ARG FOO
RUN echo "this step will be executed again if the value of FOO changes"
FROM something-else
RUN echo "this won't be affected because this stage doesn't use the FOO build-arg"
https://github.com/moby/moby/issues/1996#issuecomment-550020843
ฉันเชื่อว่านี่เป็นการปรับปรุงเล็กน้อยสำหรับคำตอบของ @ steve ด้านบน:
RUN git clone https://sdk.ghwl;erjnv;wekrv;qlk@gitlab.com/your_name/your_repository.git
WORKDIR your_repository
# Calls for a random number to break the cahing of the git clone
# (/programming/35134713/disable-cache-for-specific-run-commands/58801213#58801213)
ADD "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=h" skipcache
RUN git pull
สิ่งนี้ใช้ Docker cache ของ git clone แต่จากนั้นเรียกใช้การอัปเดตที่เก็บโดยไม่ได้เชื่อมต่อ
มันจะปรากฏขึ้นในการทำงานและมันก็เป็นได้เร็วขึ้น - แต่ขอบคุณหลาย @ Steve สำหรับการให้บริการหลักการพื้นฐาน
การแฮ็กด่วนอีกอย่างคือการเขียนไบต์แบบสุ่มก่อนคำสั่งของคุณ
RUN head -c 5 /dev/random > random_bytes && <run your command>
เขียน 5 ไบต์แบบสุ่มซึ่งจะบังคับให้พลาดแคช