ฉันเข้าใจว่าคำถามนี้มีคำตอบยอดนิยมอยู่แล้ว แต่มีวิธีใหม่กว่าในการแคชไฟล์สำหรับผู้จัดการแพ็คเกจ ฉันคิดว่ามันน่าจะเป็นคำตอบที่ดีในอนาคตเมื่อ BuildKit มีมาตรฐานมากขึ้น
ในฐานะของนักเทียบท่า 18.09 มีการสนับสนุนการทดลองสำหรับBuildKit BuildKit เพิ่มการรองรับคุณสมบัติใหม่บางอย่างใน Dockerfile รวมถึงการสนับสนุนทดลองสำหรับการติดตั้งไดรฟ์ข้อมูลภายนอกเป็นRUN
ขั้นตอน สิ่งนี้ช่วยให้เราสร้างแคชสำหรับสิ่งต่างๆเช่น$HOME/.cache/pip/
.
เราจะใช้requirements.txt
ไฟล์ต่อไปนี้เป็นตัวอย่าง:
Click==7.0
Django==2.2.3
django-appconf==1.0.3
django-compressor==2.3
django-debug-toolbar==2.0
django-filter==2.2.0
django-reversion==3.0.4
django-rq==2.1.0
pytz==2019.1
rcssmin==1.0.6
redis==3.3.4
rjsmin==1.1.0
rq==1.1.0
six==1.12.0
sqlparse==0.3.0
ตัวอย่างทั่วไปของ Python Dockerfile
อาจมีลักษณะดังนี้:
FROM python:3.7
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app/
RUN pip install -r requirements.txt
COPY . /usr/src/app
เมื่อเปิดใช้งาน BuildKit โดยใช้DOCKER_BUILDKIT
ตัวแปรสภาพแวดล้อมเราสามารถสร้างpip
ขั้นตอนที่ไม่ได้เชื่อมต่อได้ในเวลาประมาณ 65 วินาที:
$ export DOCKER_BUILDKIT=1
$ docker build -t test .
[+] Building 65.6s (10/10) FINISHED
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 120B 0.0s
=> [internal] load metadata for docker.io/library/python:3.7 0.5s
=> CACHED [1/4] FROM docker.io/library/python:3.7@sha256:6eaf19442c358afc24834a6b17a3728a45c129de7703d8583392a138ecbdb092 0.0s
=> [internal] load build context 0.6s
=> => transferring context: 899.99kB 0.6s
=> CACHED [internal] helper image for file operations 0.0s
=> [2/4] COPY requirements.txt /usr/src/app/ 0.5s
=> [3/4] RUN pip install -r requirements.txt 61.3s
=> [4/4] COPY . /usr/src/app 1.3s
=> exporting to image 1.2s
=> => exporting layers 1.2s
=> => writing image sha256:d66a2720e81530029bf1c2cb98fb3aee0cffc2f4ea2aa2a0760a30fb718d7f83 0.0s
=> => naming to docker.io/library/test 0.0s
ตอนนี้ให้เราเพิ่มส่วนหัวการทดลองและแก้ไขRUN
ขั้นตอนในการแคชแพ็คเกจ Python:
# syntax=docker/dockerfile:experimental
FROM python:3.7
WORKDIR /usr/src/app
COPY requirements.txt /usr/src/app/
RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt
COPY . /usr/src/app
ดำเนินการสร้างใหม่ทันที ควรใช้เวลาเท่ากัน แต่คราวนี้มันกำลังแคชแพ็คเกจ Python ในแคชเมาท์ใหม่ของเรา:
$ docker build -t pythontest .
[+] Building 60.3s (14/14) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 120B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> resolve image config for docker.io/docker/dockerfile:experimental 0.5s
=> CACHED docker-image://docker.io/docker/dockerfile:experimental@sha256:9022e911101f01b2854c7a4b2c77f524b998891941da55208e71c0335e6e82c3 0.0s
=> [internal] load .dockerignore 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 120B 0.0s
=> [internal] load metadata for docker.io/library/python:3.7 0.5s
=> CACHED [1/4] FROM docker.io/library/python:3.7@sha256:6eaf19442c358afc24834a6b17a3728a45c129de7703d8583392a138ecbdb092 0.0s
=> [internal] load build context 0.7s
=> => transferring context: 899.99kB 0.6s
=> CACHED [internal] helper image for file operations 0.0s
=> [2/4] COPY requirements.txt /usr/src/app/ 0.6s
=> [3/4] RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt 53.3s
=> [4/4] COPY . /usr/src/app 2.6s
=> exporting to image 1.2s
=> => exporting layers 1.2s
=> => writing image sha256:0b035548712c1c9e1c80d4a86169c5c1f9e94437e124ea09e90aea82f45c2afc 0.0s
=> => naming to docker.io/library/test 0.0s
ประมาณ 60 วินาที คล้ายกับงานสร้างครั้งแรกของเรา
ทำการเปลี่ยนแปลงเล็กน้อยrequirements.txt
(เช่นการเพิ่มบรรทัดใหม่ระหว่างสองแพ็คเกจ) เพื่อบังคับให้แคชไม่ถูกต้องและเรียกใช้อีกครั้ง:
$ docker build -t pythontest .
[+] Building 15.9s (14/14) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 120B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> resolve image config for docker.io/docker/dockerfile:experimental 1.1s
=> CACHED docker-image://docker.io/docker/dockerfile:experimental@sha256:9022e911101f01b2854c7a4b2c77f524b998891941da55208e71c0335e6e82c3 0.0s
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 120B 0.0s
=> [internal] load .dockerignore 0.0s
=> [internal] load metadata for docker.io/library/python:3.7 0.5s
=> CACHED [1/4] FROM docker.io/library/python:3.7@sha256:6eaf19442c358afc24834a6b17a3728a45c129de7703d8583392a138ecbdb092 0.0s
=> CACHED [internal] helper image for file operations 0.0s
=> [internal] load build context 0.7s
=> => transferring context: 899.99kB 0.7s
=> [2/4] COPY requirements.txt /usr/src/app/ 0.6s
=> [3/4] RUN --mount=type=cache,target=/root/.cache/pip pip install -r requirements.txt 8.8s
=> [4/4] COPY . /usr/src/app 2.1s
=> exporting to image 1.1s
=> => exporting layers 1.1s
=> => writing image sha256:fc84cd45482a70e8de48bfd6489e5421532c2dd02aaa3e1e49a290a3dfb9df7c 0.0s
=> => naming to docker.io/library/test 0.0s
ประมาณ 16 วินาทีเท่านั้น!
เราได้รับการเร่งความเร็วนี้เนื่องจากเราไม่ได้ดาวน์โหลดแพ็คเกจ Python ทั้งหมดอีกต่อไป แคชเหล่านี้ถูกแคชโดยตัวจัดการแพ็กเกจ ( pip
ในกรณีนี้) และเก็บไว้ในแคชวอลุ่มเมาท์ ไดรฟ์ข้อมูลติดตั้งไว้ในขั้นตอนการรันเพื่อให้pip
สามารถนำแพ็กเกจที่ดาวน์โหลดไปแล้วมาใช้ซ้ำได้ นี้เกิดขึ้นภายนอกใด ๆ แคชชั้นเทียบท่า
requirements.txt
กำไรที่ควรจะดีกว่ามากในขนาดใหญ่
หมายเหตุ:
- นี่คือไวยากรณ์ Dockerfile ทดลองและควรได้รับการปฏิบัติเช่นนี้ คุณอาจไม่ต้องการสร้างด้วยสิ่งนี้ในการผลิตในขณะนี้
สิ่งต่างๆของ BuildKit ไม่ทำงานภายใต้ Docker Compose หรือเครื่องมืออื่น ๆ ที่ใช้ Docker API โดยตรงในขณะนี้ ขณะนี้มีการรองรับสิ่งนี้ใน Docker Compose ตั้งแต่ 1.25.0 ดูคุณเปิดใช้งาน BuildKit ด้วย Docker-compose ได้อย่างไร?
- ไม่มีอินเทอร์เฟซโดยตรงสำหรับจัดการแคชในขณะนี้ จะถูกลบเมื่อคุณทำ
docker system prune -a
.
หวังว่าคุณสมบัติเหล่านี้จะทำให้เป็น Docker สำหรับการสร้างและ BuildKit จะกลายเป็นค่าเริ่มต้น ถ้าเป็นเช่นนั้นฉันจะพยายามอัปเดตคำตอบนี้