ডকারের বিল্ড কনটেক্সটের বাইরে ফাইলগুলি কীভাবে অন্তর্ভুক্ত করবেন?


461

আমি কীভাবে ডকার ফাইলটিতে "ADD" কমান্ডটি ব্যবহার করে ডকারের বিল্ড কনটেক্সটের বাইরের ফাইলগুলি অন্তর্ভুক্ত করতে পারি?

ডকার ডকুমেন্টেশন থেকে:

পথটি অবশ্যই নির্মাণের প্রসঙ্গে থাকতে হবে; আপনি .. / কিছু / কিছু সংযোজন করতে পারবেন না, কারণ ডকার বিল্ডের প্রথম ধাপটি প্রেরণ ডিরেক্টরি (এবং উপ-ডিরেক্টরি) ডকার ডিমনকে প্রেরণ করা।

আমি এই বিষয়ে ডকারকে সামঞ্জস্য করার জন্য আমার পুরো প্রকল্পটি পুনর্গঠন করতে চাই না। আমি আমার সমস্ত ডকার ফাইলকে একই উপ-ডিরেক্টরিতে রাখতে চাই।

এছাড়াও, এটি উপস্থিত হয় যে ডকার এখনও সিমলিংকগুলি সমর্থন করে না (এবং কখনই না পারে): সিমলিংকগুলি ডকফেরফিল এডিড কমান্ড হোস্ট # 1676 এ সিমলিংকগুলি অনুসরণ করে না।

আমি কেবল অন্য যে জিনিসটির কথা ভাবতে পারি তা হ'ল ডকার বিল্ড প্রসঙ্গে ফাইলগুলি অনুলিপি করার জন্য একটি প্রাক-বিল্ড পদক্ষেপ অন্তর্ভুক্ত করা (এবং সেই ফাইলগুলিকে উপেক্ষা করার জন্য আমার সংস্করণ নিয়ন্ত্রণটি কনফিগার করা)। এর চেয়ে ভাল কাজের আর কি আছে?


93
এটি ডকার সম্পর্কে সবচেয়ে খারাপ বিষয় হতে পারে। আমার দৃষ্টিকোণ থেকে, "ডকার প্রজেক্ট" বলে কোনও জিনিস নেই। ডকার শিপিং প্রকল্পগুলির জন্য। এটি কেবল একটি সরঞ্জাম। আমি আমার পুরো প্রকল্পটি ডকারের সাথে পুনরায় তৈরি করতে চাই না don't কোড (যেমন কৌণিক প্রকল্প) এবং এটি মোতায়েনের যা কিছু অর্থ (যেমন ডকার) এর মধ্যে পৃথকীকরণ রাখা দুর্দান্ত হবে। সর্বোপরি, সমস্ত কিছুর পাশে ডকার ফাইল থাকার সত্যিই কোনও লাভ নেই। একটি চিত্র তৈরি করতে এটি কেবল তারের জিনিসগুলি আপ আপ করেছে :(
টাইগার বিয়ার

3
হ্যাঁ, এটি একটি বড় ডাউনার। আমি একই সমস্যার মুখোমুখি হয়েছি এবং আমার কাছে একটি বৃহত আকারের বাইনারি ফাইল রয়েছে (ইতিমধ্যে সংক্ষেপিত) যা আমি প্রতিটি ডকার বিল্ড প্রসঙ্গে কপি করতে চাই না। আমি বরং এটির বর্তমান অবস্থান (ডকার বিল্ড প্রসঙ্গে) থেকে উত্স উত্পন্ন করব। এবং আমি রান সময় কোনও ভলিউম মানচিত্র করতে চাই না, কারণ আমি বিল্ড-টাইমে ফাইলটি অনুলিপি / আনড করার চেষ্টা করছি এবং আনজিপ করব এবং আমার যা করা দরকার তা করার জন্য নির্দিষ্ট বাইনারিগুলি ছবিতে বেক করা হয়েছে। এভাবে পাত্রে কাটানো দ্রুত হয় are
জার্সি শিম

আমি একটি ভাল কাঠামো পেয়েছি এবং আমি স্ট্যাকওভারফ্লো
মার্সেলো ডি সেলস

1
ডকার বিল্ডসের সাথে সমস্যা হ'ল "প্রসঙ্গ" এর অন্তর্নির্মিত ধারণা। ডকফায়াইলগুলি কোনও বিল্ড সংজ্ঞায়িত করার জন্য পর্যাপ্ত নয়, যদি না সেগুলি কৌশলগত ডিরেক্টরি (ওরফে প্রসঙ্গ) এর অধীনে স্থাপন করা হয়, যেমন "/" একটি চূড়ান্ত হিসাবে, তবে আপনি যে কোনও পথ অ্যাক্সেস করতে পারবেন (নোট করুন যে এটি কোনও বুদ্ধিমান প্রকল্পে করা সঠিক জিনিস নয়) হয় ..., প্লাস এটি ডকারটি খুব ধীর করে দেয় কারণ ডকার শুরুতে পুরো প্রসঙ্গটি স্ক্যান করে)। আপনি সমস্ত প্রয়োজনীয় ফাইল সহ একটি ডকার ইমেজ তৈরি বিবেচনা করতে পারেন এবং সেখান FROMথেকে চালিয়ে যেতে usinng করতে পারেন। আমি ডকার (বা কোনও বিল্ড সরঞ্জাম) মিলে প্রকল্পের কাঠামো পরিবর্তন করব না।
ডেভিস এল।

উত্তর:


412

এটিকে ঘিরে কাজ করার সর্বোত্তম উপায় হ'ল -f ব্যবহার করে বিল্ড প্রসঙ্গে স্বাধীনভাবে ডকফরফিলকে নির্দিষ্ট করা।

উদাহরণস্বরূপ, এই আদেশটি আপনার বর্তমান ডিরেক্টরিতে যে কোনও কিছুতে ADD কমান্ডকে অ্যাক্সেস দেবে।

docker build -f docker-files/Dockerfile .

আপডেট : ডকার এখন বিল্ড প্রসঙ্গে (18.03.0-ce, https://github.com/docker/cli/pull/886 এ স্থির ) ডকফায়াইল থাকার অনুমতি দেয় । সুতরাং আপনি যেমন কিছু করতে পারেন

docker build -f ../Dockerfile .

8
@Ro। আপনি ব্যবহার dockerfile:সম্পত্তি build:কম্পোজ ফাইলে অধ্যায় docs.docker.com/compose/compose-file/#/compose-file-reference
এমারসন Farrugia

3
আমি পেয়েছি "দকফেরফিল অবশ্যই বিল্ড প্রসঙ্গে থাকতে হবে" - আমি সত্যিই একটি ডকফাইফিল রাখতে চাই যা বর্তমান বিল্ড প্রসঙ্গে নীচে থাকতে পারে। আপনার উদাহরণে আপনার বর্তমান বিল্ড প্রসঙ্গে নীচে ডকফাইফাইল রয়েছে, যা অবশ্যই কাজ করে।
আলেকজান্ডার মিলস 9

3
হ্যাঁ, আমি কেবল একটি শেয়ারড ডকফিলি চাই যা একাধিক সাব-ডাইরেক্টরির সাথে মিল রয়েছে, এর সবগুলিই "প্রাসঙ্গিক বিষয়গুলি"
আলেকজান্ডার মিলস

50
এটি কি প্রসঙ্গত ADDডিরেক্টরিটির বাইরে থাকা কোনও ফাইলের জন্য ওপির সমস্যাটি সমাধান করে ? এটাই আমি করার চেষ্টা করছি তবে আমি মনে করি না -fবাহ্যিক ফাইলগুলি ব্যবহারযোগ্য করে তোলে।
শ্রীধর সারনোবাত

18
এই যথেষ্ট ভোট দিন করা যাবে না .. আমার মধ্যে Docker-compose.yml আমি আছে: build: context: .., dockerfile: dir/Dockerfile। এখন আমার বিল্ড প্রসঙ্গটি পিতামাতার ডিরেক্টরি!
মাইক গ্লিসন জুনিয়র কৌতুরিয়ার

50

আমি প্রায়শই নিজেকে --build-argএই উদ্দেশ্যে বিকল্পটি ব্যবহার করতে দেখি । উদাহরণস্বরূপ ডকফাইফিলের মধ্যে নিম্নলিখিতগুলি রাখার পরে:

ARG SSH_KEY
RUN echo "$SSH_KEY" > /root/.ssh/id_rsa

আপনি ঠিক করতে পারেন:

docker build -t some-app --build-arg SSH_KEY="$(cat ~/file/outside/build/context/id_rsa)" .

তবে ডকার ডকুমেন্টেশন থেকে নিম্নলিখিত সতর্কতা নোট করুন :

সতর্কতা: গিথুব কীগুলি, ব্যবহারকারীর শংসাপত্রাদি ইত্যাদির মতো গোপনীয় বিষয়গুলি পাস করার জন্য বিল্ড-টাইম ভেরিয়েবলগুলি ব্যবহার করার পরামর্শ দেওয়া হয় না বিল্ড-টাইম ভেরিয়েবল মানগুলি ডকারের ইতিহাস কমান্ডের সাহায্যে চিত্রের কোনও ব্যবহারকারীর কাছে দৃশ্যমান।


6
এটি একটি বিশাল সতর্কতা ছাড়াই দুর্বল পরামর্শ। ডকার ডকুমেন্টেশন থেকে: "সতর্কতা: গিথুব কী, ব্যবহারকারীর শংসাপত্রাদি ইত্যাদির মতো গোপনীয় বিষয়গুলি পাস করার জন্য বিল্ড-টাইম ভেরিয়েবলগুলি ব্যবহার করার পরামর্শ দেওয়া হয় না Build [1] অন্য কথায়, এই উদাহরণে প্রদত্ত উদাহরণটি ডকার চিত্রের মধ্যে ব্যক্তিগত এসএসএইচ কীটি প্রকাশ করে। কিছু প্রসঙ্গে, এটি ঠিক হতে পারে। docs.docker.com/engine/references/builder/#arg
শেলডনহ

3
পরিশেষে, এই সুরক্ষা সমস্যাটি কাটিয়ে ওঠার জন্য আপনি স্কোয়াশিং বা মাল্টিস্টেজ বিল্ডসের
জোজো

46

লিনাক্সে আপনি অন্যান্য ডিরেক্টরিগুলি সিমলিংকের পরিবর্তে মাউন্ট করতে পারেন

mount --bind olddir newdir

Https://superuser.com/questions/842642 দেখুনআরও তথ্যের জন্য ।

অন্যান্য ওএসের জন্য অনুরূপ কিছু পাওয়া যায় কিনা আমি জানি না। আমি সাম্বা ব্যবহার করে একটি ফোল্ডার ভাগ করে নেওয়ার চেষ্টা করেছি এবং ডকার প্রসঙ্গে এটি পুনঃনির্মাণ করতে পেরেছি।


2
কেবল রুট ডিরেক্টরিগুলি বাঁধতে পারে
jjcf89

28

আমি একটি ভাল প্যাটার্নটি খুঁজে বের করার চেষ্টা করে এবং এই বৈশিষ্ট্যটির সহায়তায় কী চলছে তা আরও কীভাবে আরও ভালভাবে ব্যাখ্যা করতে পারি তার জন্য আমি একটি ভাল সময় ব্যয় করেছি। আমি বুঝতে পেরেছি যে এটি ব্যাখ্যা করার সর্বোত্তম উপায়টি নিম্নরূপ ছিল ...

  • ডকফাইফাইল: কেবলমাত্র তার নিজের আপেক্ষিক পথে ফাইলগুলি দেখতে পাবে
  • প্রসঙ্গ: "স্পেস" এর একটি জায়গা যেখানে আপনি যে ফাইলগুলি ভাগ করতে চান এবং আপনার ডকফাইফিল এ অনুলিপি করা হবে

সুতরাং, সেই সাথে, এখানে ডকফাইফাইলের একটি উদাহরণ রয়েছে যার নামক একটি ফাইল পুনরায় ব্যবহার করা দরকার start.sh

Dockerfile

এটি আপনার ALWAYSআপেক্ষিক পথ থেকে লোড হবে, localআপনার নির্দিষ্ট পথগুলির উল্লেখ হিসাবে নিজের বর্তমান দির থাকবে ।

COPY start.sh /runtime/start.sh

নথি পত্র

এই ধারণাটি বিবেচনা করে, আমরা নির্দিষ্ট জিনিস তৈরি করার জন্য ডকফায়াইল্সের একাধিক অনুলিপি থাকার কথা ভাবতে পারি, তবে সেগুলির সকলের অ্যাক্সেসের প্রয়োজন start.sh

./all-services/
   /start.sh
   /service-X/Dockerfile
   /service-Y/Dockerfile
   /service-Z/Dockerfile
./docker-compose.yaml

এই কাঠামো এবং উপরের ফাইলগুলি বিবেচনা করে এখানে একটি ডকার-কমপোজ.আইএমএল

Docker-compose.yaml

  • এই উদাহরণে, আপনার sharedপ্রেক্ষাপটে Dir হয় runtimeDir।
    • একই মানসিক মডেল এখানে, মনে করুন যে এই দিরের নীচে থাকা সমস্ত ফাইল তথাকথিত স্থানান্তরিত হয়েছে context
    • একইভাবে, কেবল সেই ডকঅফাইলকে নির্দিষ্ট করুন যা আপনি একই দির অনুলিপি করতে চান। আপনি এটি ব্যবহার করে নির্দিষ্ট করতে পারেন dockerfile
  • আপনার মূল বিষয়বস্তুটি যে ডিরেক্টরিটিতে রয়েছে সেটি হ'ল আসল প্রসঙ্গ সেট করা।

docker-compose.ymlনিম্নরূপ

version: "3.3"
services:

  service-A
    build:
      context: ./all-service
      dockerfile: ./service-A/Dockerfile

  service-B
    build:
      context: ./all-service
      dockerfile: ./service-B/Dockerfile

  service-C
    build:
      context: ./all-service
      dockerfile: ./service-C/Dockerfile
  • all-serviceপ্রসঙ্গ হিসাবে সেট করা আছে, ভাগ করা ফাইল start.shসেখানে অনুলিপি করা হয় পাশাপাশি প্রতিটি দ্বারা নির্দিষ্ট করা ডকফেরফিল dockerfile
  • প্রত্যেকটি তাদের নিজস্ব উপায়ে নির্মিত হবে, প্রারম্ভের ফাইলটি ভাগ করে নেবে!

চিয়ার্স!


1
Dockerfile এ আপনার বিন্দু একদম সত্য নয়, গৃহীত উত্তর দ্বারা সরু যেমন, আপনি যদি একটি ফোল্ডার অনুক্রমের হয় a/b/c, তাহলে হ্যাঁ চলমান docker build .মধ্যে cঅ্যাক্সেস করতে মঞ্জুরি দেয় না ../file-in-b। তবে, আমি মনে করি এটির (বা অন্তত আমার ছিল) সাধারণ ভুল বোঝাবুঝিটি হ'ল প্রসঙ্গটি বিল্ড কমান্ডের প্রথম যুক্তির দ্বারা বর্ণিত অবস্থান দ্বারা সংজ্ঞায়িত করা হয়েছে, ডকফেরাইলের অবস্থানের দ্বারা নয়। সুতরাং যেমন গৃহীত উত্তরে বলা হয়েছে: থেকে a: এর docker build -f a/b/c/Dockerfile . অর্থ হ'ল ডকফাইফিলে .এখন ফোল্ডারটি রয়েছেa
εηοιτ.βε.βε

1
ডকফেরাইল ডক্স থেকে উদ্ধৃতি দেওয়া: ফাইল এবং ডিরেক্টরিগুলির পাথগুলি বিল্ডের প্রসঙ্গে উত্সের সাথে সম্পর্কিত হিসাবে ব্যাখ্যা করা হবে।
নিশান্ত জর্জ আগরওয়াল

18

আপনি যদি 2745 সংখ্যায় আলোচনাটি পড়ে থাকেন তবে কেবল ডকই কখনও কখনও সিমলিংকগুলিকে সমর্থন করতে পারে না তারা কখনও আপনার প্রসঙ্গে বাইরে ফাইল যুক্ত সমর্থন করতে পারে না। নকশার দর্শন বলে মনে হয় যে ফাইলগুলি যে ডকার বিল্ডে যায় সেগুলি স্পষ্টভাবে তার প্রসঙ্গে থাকতে পারে বা এমন কোনও ইউআরএল থেকে আসা উচিত যেখানে এটি সম্ভবত একটি নির্দিষ্ট সংস্করণের সাথে খুব বেশি মোতায়েন করা হয় যাতে বিল্ডটি সুপরিচিত ইউআরএল বা ফাইলের সাথে প্রেরিত ফাইলগুলির সাথে পুনরায় পরিবর্তনযোগ্য হয় ডকার পাত্রে

আমি কোনও সংস্করণ নিয়ন্ত্রিত উত্স - যেমন ডকার বিল্ড-টি স্টাফ থেকে তৈরি করতে পছন্দ করি http://my.git.org/repo - অন্যথায় আমি এলোমেলো ফাইলগুলির সাথে কিছু এলোমেলো জায়গা থেকে তৈরি করছি।

মৌলিকভাবে, না .... - সোভেনডোভিডিট, ডকার ইনক

কেবল আমার মতামত তবে আমি মনে করি কোড এবং ডকারের সংগ্রহস্থলগুলি আলাদা করার জন্য আপনার পুনর্গঠন করা উচিত। এইভাবে ধারকগুলি জেনেরিক হতে পারে এবং সময় তৈরির পরিবর্তে রানের সময় কোডের যে কোনও সংস্করণে টানতে পারে।

বিকল্পভাবে, আপনার মৌলিক কোড ডিপ্লোয়মেন্ট আর্টিফ্যাক্ট হিসাবে ডকার ব্যবহার করুন এবং তারপরে আপনি কোড সংগ্রহস্থলের গোড়ায় ডকফাইফিলটি রেখেছেন। আপনি যদি এই রাস্তাটিতে যান তবে সম্ভবত আরও সাধারণ সিস্টেম স্তরের বিশদগুলির জন্য পিতামাতার ডকার ধারক এবং আপনার কোডের সাথে নির্দিষ্ট সেটআপের জন্য শিশু কন্টেইনারটি বোধগম্য হয়।


তখন ডকার ব্যবহার করবেন কেন?
lscoughlin

11

আমি বিশ্বাস করি যে সহজ পরিশ্রমটি 'প্রসঙ্গ' নিজেই পরিবর্তন করা।

সুতরাং, উদাহরণস্বরূপ, দেওয়ার পরিবর্তে:

docker build -t hello-demo-app .

যা বর্তমান ডিরেক্টরিটিকে প্রসঙ্গ হিসাবে নির্ধারণ করে, আসুন আমরা বলি যে আপনি পিতামাতার ডিরেক্টরিটিকে প্রসঙ্গ হিসাবে চান, কেবল ব্যবহার করুন:

docker build -t hello-demo-app ..

6
\: - আমার মনে হয় বিরতি .dockerignore
NullVoxPopuli

আমি .dockerignore ছেড়ে দিয়েছি এবং এর পরিবর্তে মেকফিল পরিচালিত ডকার ফোল্ডার তৈরি করেছি যাতে কেবল প্রাসঙ্গিক বিল্ডের জন্য প্রয়োজনীয় ফাইল রয়েছে ... আমাকে কেবল কল করা দরকার make buildএবং এটি আপডেট করা হলে প্রয়োজনীয় সমস্ত ফাইলগুলিতে টান দেয় এবং তারপরে এটিকে উপযুক্ত ডকার বিল্ড বলে ... আমার অতিরিক্ত কাজ করা দরকার, তবে এটি নির্দোষভাবে কাজ করে কারণ আমি সম্পূর্ণ নিয়ন্ত্রণে আছি।
সহসাহে

5

আপনি প্রথমে চিত্রটির কী প্রয়োজন তার একটি টারবাল তৈরি করতে পারেন এবং এটি আপনার প্রসঙ্গ হিসাবে ব্যবহার করতে পারেন।

https://docs.docker.com/engine/reference/commandline/build/#/tarball-contexts


দুর্দান্ত টিপ! আমি আপনি এমনকি stdin উপর প্রসঙ্গ হিসাবে tarball রূপে Docker বিল্ড খাওয়াতে পারি আবিষ্কৃত: tar zc /dir1 /dir2 |docker build -। এটি আমার ক্ষেত্রে খুব সহায়ক ছিল।
টোর ওলসেন

3

ডকার-রচনা ব্যবহার করে, আমি এমন একটি পরিষেবা তৈরি করে যা আমার প্রয়োজনীয় ভলিউমগুলিকে মাউন্ট করে এবং ধারকটির চিত্র প্রতিশ্রুতিবদ্ধ দ্বারা এটি সম্পন্ন করেছি। তারপরে, পরবর্তী পরিষেবাগুলিতে, আমি পূর্ববর্তী প্রতিশ্রুতিবদ্ধ চিত্রটির উপর নির্ভর করি, যার মাউন্ট করা লোকেশনগুলিতে সমস্ত ডেটা সঞ্চিত রয়েছে। এরপরে আপনাকে এই ফাইলগুলি তাদের চূড়ান্ত গন্তব্যে অনুলিপি করতে হবে, যেহেতু docker commitকমান্ড চালানোর সময় হোস্ট মাউন্টযুক্ত ডিরেক্টরিগুলি প্রতিশ্রুতিবদ্ধ হয় না

এটি সম্পাদন করতে আপনাকে ডকার-রচনা ব্যবহার করতে হবে না, তবে এটি জীবনকে কিছুটা সহজ করে তোলে

# docker-compose.yml

version: '3'
  services:
    stage:
      image: alpine
      volumes:
        - /host/machine/path:/tmp/container/path
      command: bash -c "cp -r /tmp/container/path /final/container/path"
    setup:
      image: stage
# setup.sh

# Start "stage" service
docker-compose up stage

# Commit changes to an image named "stage"
docker commit $(docker-compose ps -q stage) stage

# Start setup service off of stage image
docker-compose up setup

1

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


1

আপনি যখন চালনা করেন তখন সহজেই ভলিউম (-v বা - মাউন্ট ফ্ল্যাগ ব্যবহার করে) কন্টেইনারটিতে মাউন্ট করা এবং ফাইলগুলিকে সেভাবে অ্যাক্সেস করা সহজ কাজ হতে পারে।

উদাহরণ:

docker run -v /path/to/file/on/host:/desired/path/to/file/in/container/ image_name

আরও দেখুন: https://docs.docker.com স্টোরেজ ভলিউমস /


নোট করুন যে ভলিউমটি রানটাইম নির্ভরতা হলে কেবল এটি কাজ করে। সময় নির্ভরতা বজায় রাখার জন্য, docker runঅনেক দেরি হয়ে গেছে।
ব্যবহারকারী 3735633

1

এই গিটহাব ইস্যুতে যেমন বর্ণনা করা হয়েছে যে বিল্ডটি বাস্তবে ঘটে /tmp/docker-12345, তাই এর মতো একটি আপেক্ষিক পথটি ../relative-add/some-fileআপেক্ষিক /tmp/docker-12345। এটি অনুসন্ধান করবে /tmp/relative-add/some-file, যা ত্রুটি বার্তায়ও প্রদর্শিত হবে *

বিল্ড ডিরেক্টরিের বাইরে থেকে ফাইলগুলি অন্তর্ভুক্ত করার অনুমতি নেই, সুতরাং এটি "নিষিদ্ধ পথ" বার্তায় ফলাফল দেয় ""


0

একটি দ্রুত এবং নোংরা উপায় হ'ল বিল্ড প্রসঙ্গটি আপনার প্রয়োজনীয় যতগুলি স্তরের সেট আপ করা - তবে এর পরিণতি হতে পারে। আপনি যদি এমন কোনও মাইক্রোসার্ভিসেস আর্কিটেকচারে কাজ করছেন যা দেখতে এইরকম দেখাচ্ছে:

./Code/Repo1
./Code/Repo2
...

আপনি পিতামাতার সাথে বিল্ড প্রসঙ্গে সেট করতে পারেন Code ডিরেক্টরিতে এবং তারপরে সমস্ত কিছু অ্যাক্সেস করতে পারেন তবে দেখা যাচ্ছে যে প্রচুর সংখ্যক সংগ্রহস্থলের সাহায্যে বিল্ডটি দীর্ঘ সময় নিতে পারে।

একটি উদাহরণ পরিস্থিতি হতে পারে যে অন্য একটি দল একটি ডেটাবেস স্কিমা Repo1এবং আপনার দলের কোড কোড বজায় রাখেRepo2 উপর নির্ভর করে। আপনি স্কিমা পরিবর্তনের বিষয়ে চিন্তা না করে বা অন্য দলের সংগ্রহস্থলকে দূষিত না করে নিজের কিছু বীজ ডেটা দিয়ে এই নির্ভরতা ডকরিজ করতে চান (পরিবর্তনগুলি কীসের উপর নির্ভর করে আপনাকে অবশ্যই আপনার বীজের ডেটা স্ক্রিপ্টগুলি পরিবর্তন করতে হবে) দ্বিতীয় পদ্ধতির হ্যাকি তবে দীর্ঘ বিল্ড ইস্যু কাছাকাছি পায়:

./Code/Repo2আপনার প্রয়োজনীয় ফাইলগুলি অনুলিপি করতে একটি sh (বা PS1) স্ক্রিপ্ট তৈরি করুন এবং আপনার পছন্দসই ডকার কমান্ডগুলি শুরু করুন, উদাহরণস্বরূপ:

#!/bin/bash
rm -r ./db/schema
mkdir ./db/schema

cp  -r ../Repo1/db/schema ./db/schema

docker-compose -f docker-compose.yml down
docker container prune -f
docker-compose -f docker-compose.yml up --build

ডকার-রচনা ফাইলটিতে, প্রসঙ্গটি কেবল Repo2রুট হিসাবে সেট করুন এবং ./db/schemaপথের বিষয়ে চিন্তা না করে আপনার ডকঅফাইলে ডিরেক্টরিতে থাকা সামগ্রীর ডিরেক্টরিটি ব্যবহার করুন । মনে রাখবেন যে আপনি দুর্ঘটনাক্রমে এই ডিরেক্টরিটি উত্স নিয়ন্ত্রণে প্রতিশ্রুতিবদ্ধ করার ঝুঁকিটি চালাবেন, তবে স্ক্রিপ্টিং ক্লিনআপ ক্রিয়াগুলি যথেষ্ট সহজ হওয়া উচিত।


0

আমার ক্ষেত্রে, আমার ডকফাইফিলটি এমন একটি টেমপ্লেটের মতো লেখা রয়েছে যাতে স্থানধারক রয়েছে যা আমি আমার কনফিগারেশন ফাইলটি ব্যবহার করে প্রকৃত মান দিয়ে প্রতিস্থাপন করছি।

সুতরাং আমি এই ফাইলটি সরাসরি উল্লেখ করতে পারি না তবে এটি ডকার বিল্ডে পাইপ করতে পারি:

sed "s/%email_address%/$EMAIL_ADDRESS/;" ./Dockerfile | docker build -t katzda/bookings:latest . -f -;

তবে পাইপের কারণে, COPYকমান্ডটি কার্যকর হয়নি। তবে উপরের উপায়ে এটি সমাধান করে -f -(স্পষ্টভাবে ফাইল সরবরাহ করা হয়নি)। শুধুমাত্র এরকম -ছাড়া -fপতাকা, প্রসঙ্গ এবং Dockerfile উপলব্ধ করা হয় না যা সতর্কীকরণ হয়।


0

কৌশলটি হ'ল এটি স্বীকৃতি দেওয়ার জন্য যে আপনি পয়েন্ট ডিরেক্টর থেকে ফাইলগুলি অন্তর্ভুক্ত করার জন্য আপনি বিল্ড কমান্ডে প্রসঙ্গটি নির্দিষ্ট করতে পারেন যদি আপনি ডকারের পথটি নির্দিষ্ট করেন তবে আমি আমার ডকফেরফিলটি দেখতে দেখতে এটি পরিবর্তন করব:

...
COPY ./ /dest/
...

তারপরে আমার বিল্ড কমান্ডটি দেখতে পারা যায়:

docker built -t TAG -f DOCKER_FILE_PATH CONTEXT

প্রকল্প ডিরেক্টরি থেকে

docker built -t username/project[:tag] -f ./docker/Dockerfile .

প্রকল্প / ডকার থেকে

docker built -t username/project[:tag] -f ./docker/Dockerfile ..
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.