আপনি প্রায়শই git clone
ডকার বিল্ডের মধ্যে থেকে কোনও ব্যক্তিগত রেপো সম্পাদন করতে চান না । সেখানে ক্লোনটি করাতে ইমেজের অভ্যন্তরে প্রাইভেট এসএস শংসাপত্রাদি রাখার সাথে জড়িত যেখানে সেগুলি পরে আপনার ছবিতে অ্যাক্সেস সহ যে কেউ পেতে পারে।
পরিবর্তে, সাধারণ অভ্যাসটি হ'ল আপনার পছন্দসই সিআই সরঞ্জামে ডকারের বাইরে থেকে গিট রেপো ক্লোন করা এবং কেবলমাত্র COPY
ফাইলগুলিকে চিত্রটিতে। এটির দ্বিতীয় সুবিধা রয়েছে: ডকার ক্যাচিং। ডকার ক্যাশিং কমান্ডটি চালিত হচ্ছে, পরিবেশের ভেরিয়েবলগুলি এতে অন্তর্ভুক্ত রয়েছে, ইনপুট ফাইলগুলি ইত্যাদির দিকে নজর দেয় এবং যদি একই প্যারেন্ট স্টেপ থেকে পূর্ববর্তী নির্মাণের সাথে একই হয় তবে এটি আগের ক্যাশেটিকে পুনরায় ব্যবহার করে। একটি git clone
কমান্ড সহ, কমান্ডটি নিজেই অভিন্ন, সুতরাং বহিরাগত গিট রেপো পরিবর্তন করা হলেও ডকার ক্যাশে পুনরায় ব্যবহার করবে। যাইহোক, একটি COPY
কমান্ড বিল্ড প্রসঙ্গে থাকা ফাইলগুলিকে দেখবে এবং সেগুলি অভিন্ন বা আপডেট হয়েছে কিনা তা দেখতে সক্ষম হবে এবং উপযুক্ত হলে কেবল ক্যাশে ব্যবহার করবে।
আপনি যদি আপনার বিল্ডে শংসাপত্র যুক্ত করতে চলেছেন তবে একাধিক-স্তরের বিল্ড দিয়ে এটি করার বিষয়ে বিবেচনা করুন এবং কেবলমাত্র সেই শংসাপত্রগুলি প্রাথমিক পর্যায়ে রাখুন যা কখনই আপনার বিল্ড হোস্টের বাইরে ট্যাগ করা বা ধাক্কা দেওয়া হয় না। ফলাফলটি দেখে মনে হচ্ছে:
FROM ubuntu as clone
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Copy over private key, and set permissions
# Warning! Anyone who gets their hands on this image will be able
# to retrieve this private key file from the corresponding image layer
COPY id_rsa /root/.ssh/id_rsa
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git
FROM ubuntu as release
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
COPY --from=clone /repo /repo
...
অতি সম্প্রতি, বিল্ডকিট কিছু পরীক্ষামূলক বৈশিষ্ট্যগুলি পরীক্ষা করছে যা আপনাকে কোনও মাউন্ট হিসাবে কোনও এসএস কী পাস করতে দেয় যা ছবিতে কখনও লেখা হয় না:
# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Clone the conf files into the docker container
RUN --mount=type=secret,id=ssh_id,target=/root/.ssh/id_rsa \
git clone git@bitbucket.org:User/repo.git
এবং আপনি এটি দিয়ে এটি তৈরি করতে পারেন:
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--secret id=ssh_id,src=$(pwd)/id_rsa .
মনে রাখবেন যে পাসওয়ার্ড সুরক্ষিত না হওয়ার জন্য এটির জন্য আপনার ssh কী প্রয়োজন, তবে আপনি কমপক্ষে একটি সিপিই কমান্ড অপসারণ করে, এবং কোনও চিত্রের অংশ হতে এসএসএস শংসাপত্রকে এড়িয়ে চলতে একটি স্টেজে বিল্ডটি চালাতে পারেন run
বিল্ডকিট কেবলমাত্র এসএসএস-এর জন্য একটি বৈশিষ্ট্য যুক্ত করেছে যা আপনাকে এখনও আপনার পাসওয়ার্ড সুরক্ষিত এসএসএস কী রাখতে সহায়তা করে, ফলাফলটি দেখে মনে হচ্ছে:
# syntax=docker/dockerfile:experimental
FROM ubuntu as clone
LABEL maintainer="Luke Crooks <luke@pumalo.org>"
# Update aptitude with new repo
RUN apt-get update \
&& apt-get install -y git
# Make ssh dir
# Create known_hosts
# Add bitbuckets key
RUN mkdir /root/.ssh/ \
&& touch /root/.ssh/known_hosts \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts
# Clone the conf files into the docker container
RUN --mount=type=ssh \
git clone git@bitbucket.org:User/repo.git
এবং আপনি এটি দিয়ে এটি তৈরি করতে পারেন:
$ eval $(ssh-agent)
$ ssh-add ~/.ssh/id_rsa
(Input your passphrase here)
$ DOCKER_BUILDKIT=1 docker build -t your_image_name \
--ssh default=$SSH_AUTH_SOCK .
আবার এটি কোনও ইমেজ লেয়ারে লিখিত না হয়ে বিল্ডে ইনজেকশন দেওয়া হয়, শংসাপত্রটি দুর্ঘটনাক্রমে ফাঁস হয়ে যাওয়ার ঝুঁকিটি সরিয়ে দেয়।
এর git clone
আগে লাইনগুলি ক্যাশে হয়ে যাওয়ার পরেও ডকারকে চালনাতে বাধ্য করার জন্য , আপনি একটি বিল্ড এআরজি ইনজেকশন করতে পারেন যা প্রতিটি বিল্ডের সাথে ক্যাশে ভাঙ্গার জন্য পরিবর্তিত হয়। দেখতে দেখতে:
# inject a datestamp arg which is treated as an environment variable and
# will break the cache for the next RUN command
ARG DATE_STAMP
# Clone the conf files into the docker container
RUN git clone git@bitbucket.org:User/repo.git
তারপরে আপনি ডেকার বিল্ড কমান্ডটিতে এই পরিবর্তনটি যুক্ত করতে পারেন:
date_stamp=$(date +%Y%m%d-%H%M%S)
docker build --build-arg DATE_STAMP=$date_stamp .