পিটার গ্রেনজারের উত্তরটি প্রসারিত করে আমি ডকার ১.0.০৫ সাল থেকে উপলব্ধ মাল্টি-স্টেজ বিল্ডটি ব্যবহার করতে সক্ষম হয়েছি । অফিসিয়াল পৃষ্ঠাতে বলা হয়েছে:
মাল্টি-স্টেজ বিল্ডগুলি সহ, আপনি FROM
আপনার ডকফাইফিলে একাধিক বিবৃতি ব্যবহার করেন । প্রতিটি FROM
নির্দেশ পৃথক বেস ব্যবহার করতে পারে এবং তাদের প্রতিটি বিল্ডের একটি নতুন পর্যায়ে শুরু করে। আপনি চূড়ান্ত চিত্রটিতে যা চান না তার সমস্ত কিছুই রেখে, বাছাই করে এক পর্যায় থেকে অন্য পর্যায়ে অনুলিপিগুলি অনুলিপি করতে পারেন।
এখানে এটি মাথায় রেখে Dockerfile
তিনটি বিল্ড স্টেজ অন্তর্ভুক্ত করার আমার উদাহরণ । এর অর্থ ক্লায়েন্ট ওয়েব অ্যাপ্লিকেশনটির একটি উত্পাদন চিত্র তৈরি করা।
# Stage 1: get sources from npm and git over ssh
FROM node:carbon AS sources
ARG SSH_KEY
ARG SSH_KEY_PASSPHRASE
RUN mkdir -p /root/.ssh && \
chmod 0700 /root/.ssh && \
ssh-keyscan bitbucket.org > /root/.ssh/known_hosts && \
echo "${SSH_KEY}" > /root/.ssh/id_rsa && \
chmod 600 /root/.ssh/id_rsa
WORKDIR /app/
COPY package*.json yarn.lock /app/
RUN eval `ssh-agent -s` && \
printf "${SSH_KEY_PASSPHRASE}\n" | ssh-add $HOME/.ssh/id_rsa && \
yarn --pure-lockfile --mutex file --network-concurrency 1 && \
rm -rf /root/.ssh/
# Stage 2: build minified production code
FROM node:carbon AS production
WORKDIR /app/
COPY --from=sources /app/ /app/
COPY . /app/
RUN yarn build:prod
# Stage 3: include only built production files and host them with Node Express server
FROM node:carbon
WORKDIR /app/
RUN yarn add express
COPY --from=production /app/dist/ /app/dist/
COPY server.js /app/
EXPOSE 33330
CMD ["node", "server.js"]
.dockerignore
.gitignore
ফাইলের বিষয়বস্তু পুনরাবৃত্তি করে (এটি প্রকল্পের ডিরেক্টরিগুলি অনুলিপি করা থেকে বাধা দেয় node_modules
এবং ফলস্বরূপ dist
):
.idea
dist
node_modules
*.log
একটি চিত্র নির্মাণের জন্য কমান্ড উদাহরণ:
$ docker build -t ezze/geoport:0.6.0 \
--build-arg SSH_KEY="$(cat ~/.ssh/id_rsa)" \
--build-arg SSH_KEY_PASSPHRASE="my_super_secret" \
./
যদি আপনার ব্যক্তিগত এসএসএইচ কী-তে কোনও পাসফ্রেজ না থাকে তবে খালি SSH_KEY_PASSPHRASE
যুক্তি নির্দিষ্ট করুন ।
এটা এভাবে কাজ করে:
1)। শুধুমাত্র প্রথম পর্যায়ে package.json
, yarn.lock
ফাইল এবং ব্যক্তিগত এসএসএইচ কী প্রথমে অন্তর্বর্তী চিত্রটির অনুলিপি করা হয় sources
। আরও এসএসএইচ কী পাসফ্রেজ এড়াতে অনুরোধ জানায় এটি স্বয়ংক্রিয়ভাবে যুক্ত হয়ে যায় ssh-agent
। শেষ yarn
অবধি কমান্ডটি এনপিএম থেকে সমস্ত প্রয়োজনীয় নির্ভরতা ইনস্টল করে এবং এসএসএইচ-র বিটবকেট থেকে ব্যক্তিগত গিট সংগ্রহস্থলগুলি ক্লোন করে।
2)। দ্বিতীয় পর্যায়ে ওয়েব অ্যাপ্লিকেশনের উত্স কোডটি তৈরি করে এবং তা ছোট করে এবং dist
এটি পরবর্তী মধ্যবর্তী চিত্রটির ডিরেক্টরিতে রাখে production
। নোট করুন যে ইনস্টল করা উত্স কোডটি এই লাইনের মাধ্যমে প্রথম পর্যায়ে উত্পাদিত node_modules
চিত্র থেকে অনুলিপি করা হয়েছে sources
:
COPY --from=sources /app/ /app/
সম্ভবত এটি নিম্নলিখিত লাইনও হতে পারে:
COPY --from=sources /app/node_modules/ /app/node_modules/
আমরা কেবলমাত্র আছে node_modules
এখানে কোন প্রথম অন্তর্বর্তী ইমেজ থেকে ডিরেক্টরি, SSH_KEY
এবং SSH_KEY_PASSPHRASE
আর্গুমেন্ট আর। বিল্ডের জন্য প্রয়োজনীয় সমস্তগুলি আমাদের প্রকল্প ডিরেক্টরি থেকে অনুলিপি করা হয়েছে।
3)। তৃতীয় পর্যায়ে আমরা চূড়ান্ত চিত্রটির একটি আকার হ্রাস করব ezze/geoport:0.6.0
যা কেবলমাত্র ওয়েব সার্ভার শুরু করার জন্য নোড এক্সপ্রেস dist
নামের দ্বিতীয় মধ্যবর্তী চিত্র থেকে কেবল ডিরেক্টরি অন্তর্ভুক্ত করে ট্যাগ করা হবে production
।
তালিকাবদ্ধ চিত্রগুলি এর ফলে একটি আউটপুট দেয়:
REPOSITORY TAG IMAGE ID CREATED SIZE
ezze/geoport 0.6.0 8e8809c4e996 3 hours ago 717MB
<none> <none> 1f6518644324 3 hours ago 1.1GB
<none> <none> fa00f1182917 4 hours ago 1.63GB
node carbon b87c2ad8344d 4 weeks ago 676MB
যেখানে ট্যাগবিহীন চিত্রগুলি প্রথম এবং দ্বিতীয় মধ্যবর্তী বিল্ড পর্যায়ে সংশোধন করে।
আপনি যদি চালান
$ docker history ezze/geoport:0.6.0 --no-trunc
আপনি চূড়ান্ত চিত্র SSH_KEY
এবং এর কোনও উল্লেখ দেখতে পাবেন না SSH_KEY_PASSPHRASE
।