আমি বুঝতে পারি এই প্রশ্নের ইতিমধ্যে কয়েকটি জনপ্রিয় উত্তর রয়েছে has প্যাকেজ পরিচালকদের জন্য ফাইলগুলি ক্যাশে করার একটি নতুন উপায় আছে। আমি মনে করি বিল্ডকিট আরও মানক হয়ে উঠলে ভবিষ্যতে এটি একটি উত্তরের উত্তর হতে পারে।
Docker 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
পাইথনের একটি আদর্শ উদাহরণ 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
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।
মন্তব্য:
- এটি পরীক্ষামূলক ডকফরফাইল সিনট্যাক্স এবং এটির মতো আচরণ করা উচিত। আপনি এই মুহূর্তে উত্পাদনের সাথে এটি তৈরি করতে চাইবেন না।
বিল্ডকিট স্টাফ ডকার রচনা বা অন্যান্য সরঞ্জামগুলির অধীনে কাজ করে না যা এই মুহুর্তে সরাসরি ডকার এপিআই ব্যবহার করে। ১.২.২.০ হিসাবে এখন ডকার রচনায় এটির জন্য সমর্থন রয়েছে। দেখুন কীভাবে আপনি ডকার-রচনা দিয়ে বিল্ডকিট সক্ষম করবেন?
- এই মুহুর্তে ক্যাশে পরিচালিত করার জন্য কোনও সরাসরি ইন্টারফেস নেই। এটি যখন আপনি একটি করবেন শুদ্ধ হয়
docker system prune -a।
আশা করি, এই বৈশিষ্ট্যগুলি এটি বিল্ডিংয়ের জন্য ডকারে পরিণত করবে এবং বিল্ডকিট ডিফল্ট হয়ে উঠবে। যদি / কখন ঘটে তবে আমি এই উত্তরটি আপডেট করার চেষ্টা করব।