ডকফাইফিলের উপর ওয়ার্কডির কী কথা?


105

আমি ডকার শিখছি অনেক বার জন্য আমি দেখেছি যে থাকেন Dockerfileহয়েছে WORKDIRকমান্ড প্রয়োগ করুন:

FROM node:latest
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY package.json /usr/src/app/
RUN npm install
COPY . /usr/src/app
EXPOSE 3000
CMD [ “npm”, “start” ] 

আমি শুধু বর্জন করা যাবে না WORKDIRএবং Copyএবং মাত্র আমার আছে Dockerfileআমার প্রকল্প root- এ? এই পদ্ধতির ব্যবহারের ডাউনসাইডগুলি কী কী?


নির্মাণের সময় আপনি ডিরেক্টরিটি পরিবর্তন করেনWORKDIR
আলট্রাভায়োলেট

1
@ আল্ট্রাভায়োলেট আপনি দয়া করে এটি ব্যাখ্যা করতে পারেন। আমি বেশ পয়েন্টটি পাচ্ছি না
লে গারকন

উত্তর:


118

ডকুমেন্টেশন অনুযায়ী :

ওয়ার্কডির নির্দেশাবলী ডকফায়লে অনুসরণ করে যে কোনও আরএন, সিএমডি, ENTRYPOINT, কপি এবং ADD নির্দেশাবলীর জন্য ওয়ার্কিং ডিরেক্টরি সেট করে। যদি ওয়ার্কডিআরটি বিদ্যমান না থাকে তবে পরবর্তী কোনও ডকফেরফাইল নির্দেশে এটি ব্যবহার না করা সত্ত্বেও এটি তৈরি করা হবে।

এছাড়াও, ডকার সেরা অনুশীলনে এটি আপনাকে এটি ব্যবহারের পরামর্শ দেয়:

... আপনার রুন সিডির মতো প্রসারিত নির্দেশের পরিবর্তে ওয়ার্কডির ব্যবহার করা উচিত… &&-do- যা পড়া, সমস্যা সমাধান, এবং বজায় রাখা শক্ত।

আমি এটি রাখার পরামর্শ দেব।

আমি মনে করি আপনি নিজের ডকস্পাইলকে এরকম কিছুতে রিফ্যাক্টর করতে পারেন:

FROM node:latest
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . ./
EXPOSE 3000
CMD [ “npm”, “start” ] 


1
আমি যখন ব্যবহার করি FROM ubuntu as builderএবং তারপরে ধারাবাহিক চিত্র ব্যবহার করি COPY, তখন কি এটি "জানে" আমি "নির্মাতা" চিত্রটিতে ওয়ার্কডির ব্যবহার করেছি বা আমাকে ধরে নিতে হবে না (এবং একটি চূড়ান্ত পথ ব্যবহার করবে)?
অ্যালেক্স 75

মতে Docker ডকুমেন্টেশন আমি বলতে হবে এটি রাখে WORKDIRমান কারণ Dockerfile মধ্যে একটি নির্দেশ দৌড়ে করার আগে আপনি চালাতে COPYএক
juanlumn

আপনার RUN mkdirআদেশ প্রয়োজন হয় না; অর্থাৎ, সেই লাইনটি মুছতে পারে। ডকুমেন্টেশন অনুসারে "যদি ওয়ার্কডিআরটি বিদ্যমান না থাকে তবে এটি পরবর্তী কোনও ডকফার্মিল নির্দেশে ব্যবহার না করা সত্ত্বেও এটি তৈরি করা হবে।" - docs.docker.com/engine/references/builder/#workdir
বেগুনি জ্যাকেট

@Purplejacket এটা কি ঠিক, আমি উত্তর আপডেট করব
juanlumn

59

আপনার দরকার নেই

RUN mkdir -p /usr/src/app

আপনি নিজের নির্দিষ্ট করে নিলে এটি স্বয়ংক্রিয়ভাবে তৈরি হবে WORKDIR

FROM node:latest
WORKDIR /usr/src/app
COPY package.json .
RUN npm install
COPY . ./
EXPOSE 3000
CMD [ “npm”, “start” ] 

4
যাইহোক, কখনও কখনও RUN এমকেডির প্রয়োজন হয় কারণ ওয়ার্কডির ডিরেক্টরি তৈরি করার সময় ব্যবহারকারীকে সম্মান করেন না - github.com/moby/moby/issues/20295
জো বোবিয়ার

22
আপনি যে WORKDIR নির্দিষ্ট করেছেন তা ফোল্ডারটি স্বয়ংক্রিয়ভাবে তৈরি করবে তা আমি পছন্দ করি।
জিঞ্জার বিয়ার

32

আপনি ধারকটির অভ্যন্তরের WORKDIRমতো ভাবতে পারেন cd(এটি কমান্ডের মতো ডকফিলিতে পরবর্তী কমান্ডগুলি প্রভাবিত করে RUN)। যদি আপনি WORKDIRউপরের উদাহরণটিতে সরিয়ে থাকেন RUN npm installতবে কাজ করবে না কারণ আপনি /usr/src/appনিজের ধারকটির ডিরেক্টরিতে থাকবেন না ।

আপনি যেখানে আপনার ডকফাইফিলটি রেখেছিলেন তার সাথে এটি কীভাবে সম্পর্কিত হবে তা আমি দেখতে পাই না (যেহেতু হোস্ট মেশিনে আপনার ডকফাইফিলের অবস্থানের পাত্রের ভিতরে পিডব্লিউডির কোনও সম্পর্ক নেই)। আপনি আপনার প্রকল্পে যেখানেই চান ডকফাইফিল রাখতে পারেন। যাইহোক, প্রথম আর্গুমেন্টটি COPYআপেক্ষিক পথ, সুতরাং আপনি যদি আপনার ডকফিলিলে স্থানান্তর করেন তবে আপনাকে সেই COPYআদেশগুলি আপডেট করার প্রয়োজন হতে পারে ।


3
যদি WORKDIRযুক্ত করা হয় তবে মূল উদাহরণে cdদুটির COPYকি একই উত্স এবং গন্তব্য থাকবে না?
জোনাস রোজনকভিস্ট

5
নং কনটেইনারটির ভিতরে থাকাWORKDIR ডিরেক্টরিকে প্রভাবিত করে । মূল উদাহরণে, প্রথম থেকে কপি হোস্ট (Dockerfile আপেক্ষিক পথ) থেকে কন্টেইনারে । প্রকৃতপক্ষে, এই নির্দিষ্ট কমান্ডের উপর এর কোনও প্রভাব নেই কারণ গন্তব্য (ধারকটির ভিতরে) কোনও আপেক্ষিক পথ ব্যবহার করছে না (পথটি শুরু হয় )। COPYpackage.json /usr/src/app/package.json WORKDIR/
mkasberg

@ এমকাসবার্গ যদি এর WORKDIRমতো কাজ করে cd। তাহলে কি 2 টি স্নিপেট সমান? WORKDIR /usr/src/app COPY package.json /usr/src/app/এবং WORKDIR /usr/src/app COPY package.json . ধন্যবাদ
kcatstack

1
হ্যাঁ, সেগুলি সমতুল্য।
mkasberg

1

ওয়ার্কডির আবেদন করার আগে। এখানে ওয়ার্কডিআর ভুল জায়গায় রয়েছে এবং সঠিকভাবে ব্যবহার করা হয় না।

FROM microsoft/aspnetcore:2
COPY --from=build-env /publish /publish
WORKDIR /publish
ENTRYPOINT ["dotnet", "/publish/api.dll"]

আমরা ওয়ার্কডিরকে সঠিক স্থানে রাখার জন্য উপরের কোডটি সংশোধন করেছি এবং নীচের বিবৃতিগুলি অপসারণের মাধ্যমে অনুকূলিত করেছি /Publish

FROM microsoft/aspnetcore:2
WORKDIR /publish
COPY --from=build-env /publish .
ENTRYPOINT ["dotnet", "/api.dll"]

1
আপনার এপিআইডিএল-এর স্ল্যাশ ইনফ্রন্ট না থাকা উচিত কারণ এটি ধারকটির গোড়ায় পৌঁছায়
তীমথিয় সি

1

টার্গেট ডিরেক্টরি নাম হিসাবে ভার্স ব্যবহার করা থেকে সাবধান থাকুন WORKDIR- এটি করার ফলে মারাত্মক ত্রুটি "কোনও কিছুই স্বাভাবিক করতে পারে না" হিসাবে দেখা দেয়। আইএমও, এটি WORKDIRএকইভাবে আচরণ করার মতো, mkdir -p <path>যেমন পথের সমস্ত উপাদানগুলি ইতিমধ্যে উপস্থিত না থাকলে তৈরি করা হয়।

আপডেট: ভেরিয়েবল সম্পর্কিত সমস্যার মুখোমুখি হয়েছি (উপরে উল্লিখিত) যখন একটি বহু-স্তরের বিল্ড চালাচ্ছি - এখন দেখা যাচ্ছে যে একটি ভেরিয়েবল ব্যবহার করা ভাল - এটি যদি (ভেরিয়েবল) "স্কোপে" থাকে যেমন নীচে, ২ য় WORKDIRরেফারেন্স ব্যর্থ হয় ...

FROM <some image>
ENV varname varval
WORKDIR $varname

FROM <some other image>
WORKDIR $varname

যদিও, এটি এতে সফল হয় ...

FROM <some image>
ENV varname varval
WORKDIR $varname

FROM <some other image>
ENV varname varval
WORKDIR $varname

.ওও ( সম্ভবত এটি ডক্সে রয়েছে এবং আমি এটি মিস করেছি )


0

আপনি কোথায় সেট করেছেন WORKDIRসে বিষয়ে সতর্ক থাকুন কারণ এটি অবিচ্ছিন্ন সংহত প্রবাহকে প্রভাবিত করতে পারে। উদাহরণস্বরূপ, এটি সেট করার /home/circleci/projectফলে ত্রুটির কারণ হতে পারে .sshবা রিমোট সার্কেল যা কিছু সেটআপ করার সময় করছে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.