বিল্ড চলাকালীন ডকফাইফায়লে হোকার ভলিউমকে ডকার পাত্রে কীভাবে মাউন্ট করবেন


236

আসল প্রশ্ন: ডকফাইফিলে ভলিউম নির্দেশিকাটি কীভাবে ব্যবহার করবেন?

আসল প্রশ্নটি যেটি আমি সমাধান করতে চাই তা হ'ল - বিল্ড চলাকালীন ডকফাইফিলের হোস্ট ভলিউমগুলি ডকার পাত্রে কীভাবে মাউন্ট করবেন, অর্থাত্‍ docker run -v /export:/exportসময়কালের ক্ষমতা থাকা উচিত docker build

এর পেছনের কারণটি হ'ল ডকারে জিনিস তৈরি করার সময় আমি সেগুলি চাই না (apt-get install ) ক্যাশেগুলি একটি ডকারে লক করা আছে, তবে সেগুলি ভাগ / পুনরায় ব্যবহার করা উচিত। আমি এই প্রশ্নটি সম্পর্কে জিজ্ঞাসা করার মূল কারণ।

সর্বশেষ আপডেট:

ডকার ভি 18.09 এর আগে সঠিক উত্তরটি দিয়ে শুরু হওয়া উচিত:

একটি বিল্ড চলাকালীন ভলিউম মাউন্ট করার একটি উপায় রয়েছে তবে এতে ডকফাইলস জড়িত না।

যাইহোক, এটি একটি দুর্বল বিবৃত, সংগঠিত এবং সমর্থিত উত্তর ছিল। যখন আমি আমার ডকারটি পুনরায় ইনস্টল করছিলাম তখন আমি নীচের নিবন্ধটিতে হোঁচট খেয়েছি:

একটি অ্যাপ্লিকেশন-ক্যাচার-এনজি পরিষেবাটি ডকোরাইজ করুন
https://docs.docker.com/engine/example/apt-cacher-ng/

এটি প্রত্যক্ষ নয় অপ্রত্যক্ষভাবে এই / আমার প্রশ্নের ডকের সমাধান। এটি গোঁড়া উপায় ডকার আমাদের করতে পরামর্শ দেয়। এবং আমি স্বীকার করি যে এখানে আমি জিজ্ঞাসা করার চেষ্টা করেছি তার চেয়ে এটি ভাল।

আর একটি উপায় হ'ল, সদ্য গৃহীত উত্তর , যেমন, v18.09-এ বিল্ডকিট।

আপনার জন্য উপযুক্ত যেটি চয়ন করুন।


ছিল: একটি সমাধান ছিল - রকার, যা ডকারের কাছ থেকে ছিল না, তবে এখন যে রকার বন্ধ হয়ে গেছে, আমি উত্তরটি আবার "সম্ভব না" ফেরত দেব ।


পুরানো আপডেট: সুতরাং উত্তরটি "সম্ভব নয়"। Https://github.com/docker/docker/issues/3156 এ সমস্যাটি ব্যাপকভাবে আলোচিত হয়েছে বলে আমি উত্তর হিসাবে এটি গ্রহণ করতে পারি । আমি বুঝতে পারি যে বহনযোগ্যতা ডকার বিকাশকারীদের জন্য সর্বজনীন সমস্যা; তবে ডকার ব্যবহারকারী হিসাবে, আমাকে বলতে হবে আমি এই হারিয়ে যাওয়া বৈশিষ্ট্যটি সম্পর্কে খুব হতাশ। উপরোক্ত আলোচনার একটি উদ্ধৃতি দিয়ে আমার যুক্তিটি বন্ধ করতে দাও: " আমি জেন্টুকে বেস ইমেজ হিসাবে ব্যবহার করতে চাই তবে অবশ্যই চিত্রটি তৈরি হওয়ার পরে> ১ জিবি পোর্টেজ ট্রি ডেটা কোনও স্তরের মধ্যে থাকতে চাই না You আপনি এটি ইনস্টল করার সময় ইমেজটিতে উপস্থিত হওয়া বিশাল পোর্টেজ গাছের জন্য না থাকলে কিছু দুর্দান্ত একটি কমপ্যাক্ট ধারক থাকতে পারে।"হ্যাঁ, আমি যা যা প্রয়োজন তা ডাউনলোড করার জন্য আমি উইজেট বা কার্ল ব্যবহার করতে পারি, তবে কেবল একটি পোর্টেবিলিটি বিবেচনার ফলে এখন আমি জেন্টু বেস চিত্রটি প্রতিবার তৈরি করার সময়> 1 গিগাবাইট পোর্টেজ ট্রি ডাউনলোড করতে বাধ্য করছি না। আরও আরও, প্যাকেজ সংগ্রহস্থলটি সবসময় / usr / Portage এর অধীনে থাকবে, এভাবে জেন্টোর অধীনে সর্বদা পোর্টেবল থাকবে আবারও, আমি এই সিদ্ধান্তকে সম্মান করি, তবে দয়া করে মাঝামাঝি সময়ে আমার হতাশা প্রকাশ করার অনুমতি দিন।ধন্যবাদ


বিশদে মূল প্রশ্ন :

থেকে

খণ্ডের মাধ্যমে ডিরেক্টরি শেয়ার করুন
http://docker.readthedocs.org/en/v0.7.3/use/working_with_volume/

এটি বলে যে ডেটা ভলিউম বৈশিষ্ট্য "ডকার রিমোট এপিআই এর সংস্করণ 1 থেকে পাওয়া যায়"। আমার ডকার সংস্করণ 1.2.0 এর, কিন্তু আমি উপরের নিবন্ধে দেওয়া উদাহরণটি কাজ করছে না তা পেয়েছি:

# BUILD-USING:        docker build -t data .
# RUN-USING:          docker run -name DATA data
FROM          busybox
VOLUME        ["/var/volume1", "/var/volume2"]
CMD           ["/usr/bin/true"]

ভলিউম কমান্ডের মাধ্যমে হোকার-মাউন্টযুক্ত ভলিউমগুলিকে ডকারের ধারকগুলিতে মাউন্ট করার ডকফায়লে সঠিক উপায় কী?

$ apt-cache policy lxc-docker
lxc-docker:
  Installed: 1.2.0
  Candidate: 1.2.0
  Version table:
 *** 1.2.0 0
        500 https://get.docker.io/ubuntu/ docker/main amd64 Packages
        100 /var/lib/dpkg/status

$ cat Dockerfile 
FROM          debian:sid

VOLUME        ["/export"]
RUN ls -l /export
CMD ls -l /export

$ docker build -t data .
Sending build context to Docker daemon  2.56 kB
Sending build context to Docker daemon 
Step 0 : FROM          debian:sid
 ---> 77e97a48ce6a
Step 1 : VOLUME        ["/export"]
 ---> Using cache
 ---> 59b69b65a074
Step 2 : RUN ls -l /export
 ---> Running in df43c78d74be
total 0
 ---> 9d29a6eb263f
Removing intermediate container df43c78d74be
Step 3 : CMD ls -l /export
 ---> Running in 8e4916d3e390
 ---> d6e7e1c52551
Removing intermediate container 8e4916d3e390
Successfully built d6e7e1c52551

$ docker run data
total 0

$ ls -l /export | wc 
     20     162    1131

$ docker -v
Docker version 1.2.0, build fa7b24f

স্পষ্টতই আরও বর্তমান বৈশিষ্ট্যটির অনুরোধ (এটি আমি বাস্তবায়িত হবে বলে আশা করি না, তবে কেবল ক্ষেত্রে): ডকার / ডকার # 14080
জেসি গ্লিক

প্রকৃতপক্ষে একটি বিস্তৃত আলোচনা রয়েছে যে এটি নির্মাণের সময় কোনও হোস্ট ডিরেক্টরি এবং কন্টেইনার ডিরেক্টরি সংযুক্ত করার অনুমতি দেওয়া উচিত নয় যেমন এর মতো কিছু VOLUME ~/host_dir ~/container_dir। আলোচনাটি বেশ বিস্তৃত, সংক্ষেপে সংক্ষিপ্ত পথের কারণ কী?
চার্লি পার্কার 21

উত্তর:


33

প্রথমে "কেন VOLUMEকাজ করে না ?" উত্তর দেওয়ার জন্য? আপনি যখন VOLUMEডকফাইলে একটিকে সংজ্ঞায়িত করেন, আপনি কেবলমাত্র লক্ষ্য নির্ধারণ করতে পারেন, ভলিউমের উত্সটি নয়। বিল্ড চলাকালীন, আপনি এটি থেকে কেবল একটি বেনাম ভলিউম পাবেন। সেই অনামী ভলিউম প্রতিটি RUNকমান্ডে মাউন্ট করা হবে , চিত্রের বিষয়বস্তুগুলির সাথে প্রিপোপুলেটেড হবে এবং তারপরে RUNকমান্ডের শেষে ফেলে দেওয়া হবে । কেবলমাত্র ধারকটির পরিবর্তনগুলি সংরক্ষণ করা হয়, ভলিউমে পরিবর্তন হয় না।


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

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

FROM debian:sid as builder
COPY export /export
RUN compile command here >/result.bin

FROM debian:sid
COPY --from=builder /result.bin /result.bin
CMD ["/result.bin"]

এর ফলে এমন একটি বিল্ড তৈরি হবে যা কেবলমাত্র ফলাফল বাইনারি রাখে, এবং সম্পূর্ণ / রফতানি ডিরেক্টরি নয়।


বিল্ডকিট পরীক্ষামূলকভাবে 18.09-এ বেরিয়ে আসছে। এটি সীমানা পার্সার পরিবর্তন করার ক্ষমতা সহ বিল্ড প্রক্রিয়াটির সম্পূর্ণ পুনরায় নকশা। এই পার্সার পরিবর্তনগুলির মধ্যে একটি RUN --mountবিকল্পটি কার্যকর করেছে যা আপনাকে আপনার রান কমান্ডগুলির জন্য একটি ক্যাশে ডিরেক্টরি মাউন্ট করতে দেয়। উদাহরণস্বরূপ, এখানে একটি ডিবিয়ান ডিরেক্টরিকে মাউন্ট করে (ডেবিয়ান চিত্রের পুনর্নির্মাণের সাথে এটি প্যাকেজগুলির পুনরায় ইনস্টলকে গতিতে পারে):

# syntax = docker/dockerfile:experimental
FROM debian:latest
RUN --mount=target=/var/lib/apt/lists,type=cache \
    --mount=target=/var/cache/apt,type=cache \
    apt-get update \
 && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
      git

আপনার কাছে থাকা অ্যাপ্লিকেশন ক্যাশে যা আছে তার জন্য আপনি ক্যাশে ডিরেক্টরিটি সামঞ্জস্য করবেন, যেমন ma মাভেনের জন্য হোম / .m2, অথবা গোলংয়ের জন্য /root/.cache .c


টিএল; ডিআর: উত্তর এখানে রয়েছে: সেই RUN --mountসিনট্যাক্সের সাহায্যে আপনি বিল্ড-প্রসঙ্গ থেকে মাউন্ট পঠনযোগ্য ডিরেক্টরিগুলিও আবদ্ধ করতে পারেন। ফোল্ডারটি অবশ্যই বিল্ড প্রসঙ্গে থাকতে হবে এবং এটি হোস্ট বা বিল্ড ক্লায়েন্টকে ম্যাপ করা যায় না:

# syntax = docker/dockerfile:experimental
FROM debian:latest
RUN --mount=target=/export,type=bind,source=export \
    process export directory here...

মনে রাখবেন যে ডিরেক্টরিটি প্রসঙ্গ থেকে মাউন্ট করা হয়েছে, এটি কেবল পঠনযোগ্য হিসাবেও মাউন্ট করা হয়েছে এবং আপনি পরিবর্তনগুলি হোস্ট বা ক্লায়েন্টের কাছে ফিরিয়ে রাখতে পারবেন না। আপনি যখন নির্মাণ করেন, আপনি একটি 18.09 বা আরও নতুন ইনস্টল করতে চান এবং এর সাথে বিল্ডকিট সক্ষম করুন export DOCKER_BUILDKIT=1

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


2
দুর্ভাগ্যক্রমে, উইন্ডোজ বিল্ডকিটটিতে 18.09 সংস্করণে এখনও সমর্থিত নয়
ওয়েসলি

1
দেখে মনে হচ্ছে "আর্মএফ" "মাউন্ট" কেও সমর্থন করে না।
মাইক 6

2
আমি "ডিমন থেকে ত্রুটির প্রতিক্রিয়া পাচ্ছি: ডকফেরফিল পার্স ত্রুটি রেখা xx: অজানা পতাকা: মাউন্ট" ওএসএক্স
ক্রিস্টোকিভি 16'19

1
ডকার-রচনাটির জন্য সমর্থন এখনও সেখানে নেই, তবে চিত্রগুলি তৈরি করতে আপনার রচনার দরকার নেই। ট্র্যাক করতে ইস্যু: github.com/moby/buildkit/issues/685
BMich

2
এটি সম্পর্কে ডকুমেন্টেশন: github.com/moby/buildkit/blob/master/frontend/dockerfile/docs/…
ড্রু

116

VOLUMEডককে কী মাউন্ট করবেন তা জানাতে নির্দেশ ব্যবহার করা সম্ভব নয় । এটি গুরুত্ব সহকারে বহনযোগ্যতা ভঙ্গ করবে। এই নির্দেশনা ডকারকে বলে যে এই ডিরেক্টরিগুলির মধ্যে থাকা সামগ্রীগুলি চিত্রগুলিতে যায় না এবং --volumes-fromকমান্ড লাইন প্যারামিটার ব্যবহার করে অন্যান্য ধারক থেকে অ্যাক্সেস করা যায় । -v /path/on/host:/path/in/containerহোস্ট থেকে ডিরেক্টরি অ্যাক্সেস ব্যবহার করে আপনাকে ধারক চালাতে হবে ।

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


2
ধন্যবাদ। প্রশ্ন সংশোধিত। আসল প্রশ্নটি যা আমি সমাধান করতে চাই তা হ'ল - বিল্ড চলাকালীন কীভাবে হোস্ট ভলিউমগুলি ডকফাইফিলের ডকার পাত্রে স্থাপন করতে হয়। ধন্যবাদ.
xpt

2
সম্ভব না. সংশোধিত উত্তর দেখুন।
আন্দ্রেয়াস স্টেফান

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

64

আপডেট: কেউ উত্তর হিসাবে গ্রহণ করবে না, এবং আমি এটি খুব পছন্দ, বিশেষত এই নির্দিষ্ট প্রশ্নের।

ভাল খবর, এখন একটি উপায় আছে -

সমাধানটি রকার: https://github.com/grammarly/rocker

জন ইয়ানি বলেছিলেন , "আইএমও, এটি ডকফাইফিলের সমস্ত দুর্বল পয়েন্টগুলি সমাধান করে, এটি উন্নয়নের উপযুক্ত করে তোলে।"

আন্দোলক

https://github.com/grammarly/rocker

নতুন কমান্ড প্রবর্তনের মাধ্যমে রকারের লক্ষ্য নিম্নোক্ত ব্যবহারের কেসগুলি সমাধান করা, যা প্লেইন ডকারের সাথে বেদনাদায়ক:

  1. বিল্ড পর্যায়ে পুনরায় ব্যবহারযোগ্য ভলিউম মাউন্ট করুন, তাই নির্ভরতা পরিচালনার সরঞ্জামগুলি বিল্ডগুলির মধ্যে ক্যাশে ব্যবহার করতে পারে।
  2. বিল্ডের সাথে ssh কীগুলি ভাগ করুন (প্রাইভেট রেপোগুলি টানার জন্য), ফলস্বরূপ চিত্রটিতে না রেখে।
  3. বিভিন্ন চিত্রগুলিতে অ্যাপ্লিকেশন তৈরি এবং চালনা করুন, সহজেই একটি চিত্র থেকে অন্য চিত্রতে একটি শৈলীটি পাস করতে সক্ষম হবেন, আদর্শভাবে এই যুক্তিটি একটি একক ডকফেরফাইলে থাকতে পারেন।
  4. ডকফিলিলেস থেকে চিত্রগুলি ট্যাগ / পুশ করুন।
  5. শেল বিল্ড কমান্ড থেকে ভেরিয়েবলগুলি পাস করুন যাতে সেগুলি ডকফাইফিলের পরিবর্তে স্থাপন করতে পারে।

এবং আরও। এগুলি সর্বাধিক সমালোচিত সমস্যাগুলি যা ব্যাকরণে আমাদের ডকারকে গ্রহণ অবরুদ্ধ করেছিল।

আপডেট: গিথুবের সরকারী প্রকল্পের রেপো অনুসারে রকার বন্ধ করা হয়েছে

2018 এর প্রথমদিকে, এই প্রকল্পটির সূচনা যখন তিন বছর আগে হয়েছিল তার চেয়ে কন্টেইনার ইকোসিস্টেমটি অনেক বেশি পরিপক্ক। এখন, রকারের কিছু সমালোচনামূলক এবং অসামান্য বৈশিষ্ট্যগুলি সহজেই ডকার বিল্ড বা অন্যান্য ভাল-সমর্থিত সরঞ্জামগুলি দ্বারা কভার করা যেতে পারে, যদিও কিছু বৈশিষ্ট্য রকারের কাছে অনন্য থেকে যায়। আরও তথ্যের জন্য https://github.com/grammarly/rocker/issues/199 দেখুন ।


আমি 1 নম্বর সমস্যা সমাধানের জন্য রকার ব্যবহার করার চেষ্টা করছি তবে মাউন্ট কমান্ড কাজ করবে না এবং তৈরি করা চিত্রটিতে হোস্ট ফোল্ডারটি নেই। আমার ডকফাইফিল মাউন্ট কমান্ডটি দেখতে দেখতে - MOUNT ~/code/docker-app-dev/new-editor/:/src/এবং আমার রকার বিল্ড কমান্ডটি হ'ল - rocker build -f Dockerfile .। আমি কি ভুল করছি?
ইয়ারন ইদান 4'16

একটি বাস্তব হোস্ট পাথ ব্যবহার করার চেষ্টা করতে পারেন? ~বোর্ন শেল মেটাচার্যাক্টর।
জেসি গ্লিক

Rocker builddocker runকমান্ড-লাইন বিকল্পগুলিকে অনুমতি দেয় না , সুতরাং বর্তমানে জিনিসগুলি পছন্দ করে না --privileged
মন্টি ওয়াইল্ড

হাই @ xpt, রকার এখন বন্ধ হয়ে
যাওয়ার

এখন যে রকার বন্ধ হয়ে গেছে, আমি উত্তরটি আবার "সম্ভব না" ফেরত দেব। ওপি এবং নির্বাচিত উত্তর দেখুন।
xpt

14

একটি বিল্ড চলাকালীন ভলিউম মাউন্ট করার একটি উপায় রয়েছে তবে এতে ডকফাইলস জড়িত না।

কৌশলটি হ'ল আপনি যে বেসটি ব্যবহার করতে চান সেটি থেকে ধারক তৈরি করুন ( -vবিকল্পটি দিয়ে ধারকটিতে আপনার ভলিউম (গুলি) মাউন্ট করা ), আপনার চিত্র তৈরির কাজ করতে একটি শেল স্ক্রিপ্ট চালানো, তারপরে কনটেইনারটি চিত্র হিসাবে প্রতিশ্রুতিবদ্ধ

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

হালনাগাদ:

উদাহরণ স্বরূপ,

CONTAINER_ID=$(docker run -dit ubuntu:16.04)
docker cp build.sh $CONTAINER_ID:/build.sh
docker exec -t $CONTAINER_ID /bin/sh -c '/bin/sh /build.sh'
docker commit $CONTAINER_ID $REPO:$TAG
docker stop $CONTAINER_ID

6
+1 আপনি দয়া করে ২ য় অনুচ্ছেদে নির্দেশিকাগুলি সম্পর্কে আরও কিছুটা ব্যাখ্যা করতে পারেন। উদাহরণস্বরূপ, যদি বেস হয় debian:wheezyএবং শেল স্ক্রিপ্ট হয় তবে build.shকোন নির্দিষ্ট নির্দেশাবলী ব্যবহার করবে?
ড্র্রুস

6

আপনি যখন ধারকটি চালাচ্ছেন, আপনার হোস্টের একটি ডিরেক্টরি তৈরি এবং ধারকটিতে মাউন্ট করা হবে। এটি কী ডিরেক্টরিতে রয়েছে তা আপনি খুঁজে পেতে পারেন

$ docker inspect --format "{{ .Volumes }}" <ID>
map[/export:/var/lib/docker/vfs/dir/<VOLUME ID...>]

আপনি যদি আপনার ধারকের অভ্যন্তরে আপনার হোস্ট থেকে কোনও ডিরেক্টরি মাউন্ট করতে চান তবে আপনাকে -vপ্যারামিটারটি ব্যবহার করতে হবে এবং ডিরেক্টরিটি নির্দিষ্ট করতে হবে। আপনার ক্ষেত্রে এটি হবে:

docker run -v /export:/export data

সুতরাং আপনি আপনার ধারকটির ভিতরে হোস্ট ফোল্ডারটি ব্যবহার করবেন।


1
ধন্যবাদ। প্রশ্ন সংশোধিত। আসল প্রশ্নটি যা আমি সমাধান করতে চাই তা হ'ল - বিল্ড চলাকালীন কীভাবে হোস্ট ভলিউমগুলি ডকফাইফিলের ডকার পাত্রে স্থাপন করতে হয়। ধন্যবাদ.
xpt

দয়া করে আপনার প্রশ্নগুলিকে এমন কঠোর উপায়ে সংশোধন করবেন না । এটি আমার প্রশ্নটিকে অবৈধ করে তোলে যদিও এটি আপনার সম্পাদনার আগে পুরোপুরি বৈধ ছিল। পরিবর্তে একটি নতুন প্রশ্ন জিজ্ঞাসা বিবেচনা করুন।
বেহে

11
আসল প্রশ্ন : ডকফাইফিলে ভলিউম নির্দেশিকাটি কীভাবে ব্যবহার করবেন? এটি এখনও আজকের মতো প্রশ্নের শুরুতে এখনও। আপনার উত্তর রান সময় ছিল , এবং আমার প্রশ্ন সবসময় বিল্ড সময় সম্পর্কে ছিল , যা ডকফাইফিল জন্য হয়।
এক্সপিটি

4

আমার মনে হয় আপনি ডকার কমান্ডের মাধ্যমে বিল্ডটি চালিয়ে যা করতে চান তা করতে পারেন যা নিজেই একটি ডকারের ধারক ভিতরে চালিত হয়। দেখুন ডকার এখন ডকারের মধ্যে চলতে পারে | ডক-শ্রমিক ব্লগ । এর মতো একটি কৌশল, যা আসলে কোনও ধারক দিয়ে বাইরের ডকারটি অ্যাক্সেস করেছিল, ব্যবহৃত হয়েছিল, উদাহরণস্বরূপ, সবচেয়ে ছোট সম্ভাব্য ডকার পাত্রে কীভাবে তৈরি করা যায় তা অন্বেষণ করার সময় | Xebia ব্লগ

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


3

এটি কুৎসিত, তবে আমি এর মতো একটি লক্ষণ অর্জন করেছি:

Dockerfile:

FROM foo
COPY ./m2/ /root/.m2
RUN stuff

imageBuild.sh:

docker build . -t barImage
container="$(docker run -d barImage)"
rm -rf ./m2
docker cp "$container:/root/.m2" ./m2
docker rm -f "$container"

আমার কাছে একটি জাভা বিল্ড রয়েছে যা বিশ্বজুড়ে /root/.m2 এ ডাউনলোড করে এবং প্রতিবারেই তা করেimageBuild.shবিল্ডের পরে হোস্টটিতে সেই ফোল্ডারটির বিষয়বস্তু Dockerfileঅনুলিপি করে এবং পরবর্তী বিল্ডের জন্য সেগুলি আবার চিত্রটিতে অনুলিপি করে।

এটি এমন কিছু যা ভলিউম কীভাবে কাজ করবে (যেমন এটি বিল্ডগুলির মধ্যে স্থির থাকে)।


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

এই সমাধানটি আপনাকে সমস্ত ফাইল সহ ./m2/- এ একটি চিত্র দেয় - আপনার যা প্রয়োজন এবং যা আপনার প্রয়োজন হয় না - এবং এটি প্রচুর উত্পাদন চিত্র নিয়ে যেতে পারে, যা পছন্দসই নয়! বাহ্যিক নির্ভরতা ডিরেক্টরিতে মাউন্ট করার সাথে কেবল প্রয়োজনীয় ফাইলগুলি ছবিতে অনুলিপি করা হত।
মার্কো ক্র্যাজঙ্ক

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

1

শেল স্ক্রিপ্ট ছাড়াই বিল্ড অ্যান্ড কমিট ব্যবহার করে 2-পদক্ষেপের পদ্ধতির সরল সংস্করণ এখানে। এতা অন্তরভুক্ত:

  1. আংশিকভাবে ভলিউম ছাড়াই চিত্রটি তৈরি করা
  2. মূল চিত্রের নাম প্রতিস্থাপন করে ভলিউম সহ একটি ধারক চালানো , পরিবর্তন করা, তারপরে ফলাফল প্রতিশ্রুতিবদ্ধ।

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

মূলত:

docker build -t image-name . # your normal docker build

# Now run a command in a throwaway container that uses volumes and makes changes:
docker run -v /some:/volume --name temp-container image-name /some/post-configure/command

# Replace the original image with the result:
# (reverting CMD to whatever it was, otherwise it will be set to /some/post-configure/command)   
docker commit --change="CMD bash" temp-container image-name 

# Delete the temporary container:
docker rm temp-container

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


1

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

Dockerfile

FROM node:10
WORKDIR /app
COPY . .
RUN npm ci
CMD sleep 999999999

Docker-compose.yml

version: '3'
services:
  test-service:
    image: test/image
    build:
      context: .
      dockerfile: Dockerfile
    container_name: test
    volumes:
      - ./export:/app/export
      - ./build:/app/build

এবং দ্বারা আপনার ধারক চালান docker-compose up -d --build

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