मैं समझता हूं कि इस प्रश्न के कुछ लोकप्रिय उत्तर पहले से ही हैं। लेकिन पैकेज प्रबंधकों के लिए फ़ाइलों को कैश करने का एक नया तरीका है। मुझे लगता है कि यह भविष्य में एक अच्छा जवाब हो सकता है जब BuildKit अधिक मानक हो जाता है।
डॉक 18.09 के रूप में बिल्डकिट के लिए प्रयोगात्मक समर्थन है । बिल्डकिट कदमों में बढ़ते बाहरी संस्करणों के लिए प्रयोगात्मक समर्थन सहित डॉकफाइल में कुछ नई सुविधाओं के लिए समर्थन जोड़ता है 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
एक विशिष्ट उदाहरण पायथन 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पायथन पैकेजों को कैश करने के लिए चरण को संशोधित करें :
# 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
आगे बढ़ो और अब एक और निर्माण करो। इसमें उतना ही समय लगना चाहिए। लेकिन इस बार यह हमारे नए कैश माउंट में पायथन पैकेजों को कैशिंग कर रहा है:
$ 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 सेकंड के बारे में!
हमें यह स्पीडअप मिल रहा है क्योंकि हम अब सभी पायथन पैकेज डाउनलोड नहीं कर रहे हैं। उन्हें पैकेज प्रबंधक ( pipइस मामले में) द्वारा कैश किया गया था और कैश वॉल्यूम माउंट में संग्रहीत किया गया था। वॉल्यूम माउंट रन कदम को प्रदान किया जाता है ताकि pipहमारे पहले से डाउनलोड किए गए पैकेज का पुन: उपयोग कर सकें । यह किसी भी डॉकर परत कैशिंग के बाहर होता है ।
बड़े पर लाभ अधिक बेहतर होना चाहिए requirements.txt।
टिप्पणियाँ:
- यह प्रायोगिक Dockerfile सिंटैक्स है और इसे ऐसे ही माना जाना चाहिए। आप इस समय उत्पादन में इसके साथ निर्माण नहीं करना चाह सकते हैं।
BuildKit सामान Docker Compose या अन्य टूल्स के तहत काम नहीं करता है जो सीधे Docker API का उपयोग करते हैं। डॉकटर कंपोज़ में अब इसके लिए 1.25.0 का समर्थन है। देखें कि आप बिल्डकिट को डॉकटर-कंपोज के साथ कैसे सक्षम करते हैं?
- फिलहाल कैश को प्रबंधित करने के लिए कोई प्रत्यक्ष इंटरफ़ेस नहीं है। यह शुद्ध है जब आप एक करते हैं
docker system prune -a।
उम्मीद है, इन सुविधाओं के निर्माण के लिए यह डॉकर में बना देगा और BuildKit डिफ़ॉल्ट हो जाएगा। यदि / जब ऐसा होता है तो मैं इस उत्तर को अपडेट करने का प्रयास करूंगा।