একাধিক FROM- এর অর্থ কী


112

আমি গিথুব-লিংকুরিয়াস প্রকল্পের জন্য একটি ডকার চিত্র তৈরি করতে চাই , যার জন্য Neo4j ডাটাবেস এবং নোড.জেএস উভয়ই চালানো দরকার।

আমার প্রথম পদ্ধতিরটি ছিল Neo4j সমেত আমার চিত্রের জন্য একটি বেস চিত্র ঘোষণা করা। রেফারেন্স ডক্স কোনও সহায়ক উপায়ে "বেস চিত্র" সংজ্ঞায়িত করে না:

বেস ইমেজ: কোনও চিত্র যার পিতামাতা নেই তা একটি বেস ইমেজ

যা থেকে আমি পড়েছি যে কেবলমাত্র একটি বেস ইমেজ থাকতে পারে যদি সেই চিত্রটির কোনও বেস ইমেজ না থাকে।

তবে বেস ইমেজ কি? এর অর্থ কি এই যে আমি যদি কোনও এফআরএম নির্দেশে neo4j / neo4j ঘোষণা করি, যখন আমার চিত্রটি চালিত হবে তখন নব্য ডাটাবেসটি স্বয়ংক্রিয়ভাবে চালিত হবে এবং 7474 বন্দরের পাত্রে পাওয়া যাবে?

ডকার রেফারেন্স পড়ুন (দেখুন: https://docs.docker.com/references/builder/#from ) আমি দেখতে পেয়েছি:

একাধিক চিত্র তৈরি করতে FROM একক ডকফেরফিলের মধ্যে একাধিকবার উপস্থিত হতে পারে। প্রতিটি নতুন এফআরএম কমান্ডের আগে কমিটের মাধ্যমে সর্বশেষ চিত্রের আইডি আউটপুটটি কেবল একটি নোট করুন।

আমি কি একাধিক চিত্র তৈরি করতে চাই? মনে হচ্ছে আমি যা চাই তা হ'ল একক চিত্র যাতে অন্যান্য চিত্রের সামগ্রী যেমন neo4j এবং node.js থাকে

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

আমি বিভ্রান্ত ...


নোট: মে 2017, আপনি এখন একাধিক আছে FROMএকটি Dockerfile। নীচে আমার সম্পাদিত উত্তর দেখুন।
ভনসি 25'17

আপনি আমার উত্তর ক্লিনার খুঁজে পান কিনা দেখুন। এবং যদি তা হয় তবে তা গ্রহণ করার বিষয়টি বিবেচনা করুন।
ইভান ক্যারল

উত্তর:


113

বেস ইমেজ কি?

ফাইলগুলির একটি সেট, প্লাস EXPOSE'ডি পোর্ট ENTRYPOINTএবং CMD
আপনি নির্দেশ যুক্ত Dockerfileদিয়ে নতুন শুরু করে সেই বেস চিত্রটির উপর ভিত্তি করে ফাইল যুক্ত করতে এবং একটি নতুন চিত্র তৈরি করতে পারেন FROM: পরে বর্ণিত FROMচিত্রটি আপনার নতুন চিত্রের জন্য "বেস চিত্র"।

এর অর্থ কি যদি আমি neo4j/neo4jকোনও FROMনির্দেশে ঘোষণা করি যে আমার চিত্রটি যখন নিও ডাটাবেসটি চালিত হবে তখন স্বয়ংক্রিয়ভাবে চলবে এবং 74৪74৪ বন্দরের পাত্রে কনটেইনারটি উপলব্ধ হবে?

আপনি ওভাররাইট না করলেই CMDএবং ENTRYPOINT
তবে চিত্রটি নিজেই যথেষ্ট: আপনি FROM neo4j/neo4jযদি neo4jআপনার নির্দিষ্ট ব্যবহারের জন্য সম্পর্কিত ফাইলগুলি যুক্ত করতে চান তবে আপনি একটি ব্যবহার করবেন neo4j

FROM একক ডকফেরফিলের মধ্যে একাধিকবার উপস্থিত হতে পারে

না: যেভাবেই "বৈশিষ্ট্য" মুছে ফেলার প্রস্তাব রয়েছে ( ইস্যু 13026 )

14412 সংখ্যা উল্লেখ করেছে:

একাধিক ব্যবহার FROMসত্যিই একটি বৈশিষ্ট্য কিন্তু একটি বাগ নয় (ওহ ভাল, সীমা শক্ত এবং সেখানে একাধিক জন্য কয়েক ব্যবহারের ক্ষেত্রে হয় FROMএকটি Dockerfile মধ্যে)।


ডকের (মোবি) 17.05-সিই সহ মে 2017 (18 মাস পরে) আপডেট করুন ।

একাধিক FROM একক ডকফেরফাইলে ব্যবহার করা যেতে পারে।
"দেখ নির্মাতা প্যাটার্ন বনাম মাল্টি পর্যায় Docker মধ্যে তৈরী করে " (দ্বারা অ্যালেক্স এলিস ) এবং জনসংযোগ 31257 দ্বারা টোন Tiigi

আগে:

বিল্ডার প্যাটার্নটিতে দুটি ডকার চিত্র ব্যবহার করা জড়িত - একটি বিল্ড সম্পাদন করার জন্য এবং অন্যটি প্রথম চিত্রের বিল্ড-চেইন এবং টুলিংয়ের জরিমানা ছাড়াই প্রথম বিল্ডের ফলাফলগুলি জাহাজে প্রেরণে জড়িত।

পরে:

সাধারণ বাক্য FROMগঠনটি আপনার ডকফাইফিলের মধ্যে অতিরিক্ত সময় যুক্ত করে - যা শেষ FROMবিবৃতিটি চূড়ান্ত বেস চিত্র। অন্তর্বর্তী চিত্র ব্যবহার থেকে শিল্পকলা এবং আউটপুট অনুলিপি করতে COPY --from=<base_image_number>

ডকফাইফাইলের প্রথম অংশ:

FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html  
COPY app.go    .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

একই (!) ডকফায়াইলের দ্বিতীয় অংশ :

FROM alpine:latest  
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app    .
CMD ["./app"]  

ফলাফল দুটি চিত্র হবে, একটি বিল্ডিংয়ের জন্য, একটি মাত্র ফলাফলযুক্ত অ্যাপ্লিকেশন সহ (অনেক, অনেক ছোট)

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

multi               latest              bcbbf69a9b59        6 minutes ago       10.3MB  
golang              1.7.3               ef15416724f6        4 months ago        672MB  

2
একাধিক FROMs অপসারণ সম্পর্কে করুণা। এটি আমার কাছে সবচেয়ে দরকারী বলে মনে হচ্ছে, বিশেষত নির্ভরতা ব্যবস্থার অভাবে। আরপিএম সহ, উদাহরণস্বরূপ, আমি ঘোষণা করতে পারি যে আমার প্যাকেজটির জন্য আরেকটি প্যাকেজ দরকার যাতে ইনস্টল করার সময় আমার জন্য সবকিছু সেট আপ হয়। বাস্তবতা হ'ল বেশিরভাগ কিছুতে একাধিক নির্ভরতা প্রয়োজন তাই একাধিক এফআরএমের অনুপস্থিতিতে, কীভাবে এটি কাজ করার কথা?
এক্কিস

3
@ekkis হিসাবে আমি আমার আগের উত্তর (উল্লেখিত stackoverflow.com/a/33295292/6309 ), আপনি একাধিক পাত্রে পরিকল্পনার দ্বারা আপনার সিস্টেমে চালানোর জন্য, প্রতিটি এক একটি নির্দিষ্ট সেবা প্রদানকারী, এবং --link মাধ্যমে যোগাযোগ ( docs.docker.com/ ব্যবহারকারীগাইড / ডকারলিঙ্কস /… )।
ভোনসি

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

@rainabba একমত উত্তরাধিকারী মনোলিথগুলি সহজেই স্থানান্তরিত হবে না। আকর্ষণীয় পাঠ্য: মার্টিনফাউলার / আর্টিকেলস_ , থ্রিডটস.টেক / পোস্ট
মাইক্রোসার্ভেসেসস-

2

প্রথম উত্তরটি আমার রুচিগুলির জন্য অত্যন্ত জটিল, historicতিহাসিক এবং তথ্যহীন।


এটি আসলে বরং সহজ। ডকার মাল্টি-স্টেজ নামে পরিচিত একটি কার্যকারিতা সরবরাহ করে এখানে মূল ধারণাটি হ'ল,

  • আপনি যা চান না তাকে শ্বেত তালিকাতে বাধ্য করে, যা আপনি চান তা ম্যানুয়ালি অপসারণ থেকে মুক্ত করুন,
  • ডকারের প্রয়োগের কারণে নিখরচায় সংস্থানগুলি গ্রহণ করা হবে।

প্রথম দিয়ে শুরু করা যাক। খুব প্রায়শই আপনি দেবিয়ান জাতীয় কিছু দিয়ে দেখতে পাবেন।

RUN apt-get update \ 
  && apt-get dist-upgrade \
  && apt-get install <whatever> \
  && apt-get clean

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

RUN apt-get update ;
RUN apt-get dist-upgrade;
RUN apt-get install <whatever>;
RUN apt-get clean;

এর ফলে আরও 3 টি অস্থায়ী মধ্যবর্তী চিত্র পাওয়া যাবে। এটি একটি ইমেজে কমে যাওয়ার পরে, আর একটি সমস্যা রয়েছে: apt-get cleanইনস্টলে ব্যবহৃত নিদর্শনগুলি পরিষ্কার করে না। যদি কোনও ডেবিয়ান রক্ষণাবেক্ষণকারী তার ইনস্টলটিতে এমন কোনও স্ক্রিপ্ট অন্তর্ভুক্ত করে যাতে সিস্টেমটি পরিবর্তন করে যে পরিবর্তনটিও চূড়ান্ত সমাধানে উপস্থিত হবে (এর pepperflashplugin-nonfreeউদাহরণের মতো কিছু দেখুন )।

মাল্টি-স্টেজ বিল্ডটি ব্যবহার করে আপনি একটি একক পরিবর্তিত ক্রিয়াকলাপের সমস্ত সুবিধা পাবেন, তবে এটির জন্য আপনাকে এখানে ম্যানুয়ালি শ্বেতলিস্ট তালিকা তৈরি করতে হবে এবং COPY --fromএখানে নথিভুক্ত সিনট্যাক্স ব্যবহার করে অস্থায়ী চিত্রটিতে প্রদর্শিত হওয়া ফাইলগুলি অনুলিপি করতে হবে । তদুপরি, এটি একটি দুর্দান্ত সমাধান যেখানে বিকল্প নেই (যেমন একটি apt-get clean), এবং আপনার অন্যথায় আপনার চূড়ান্ত চিত্রটিতে প্রচুর অপ্রয়োজনীয় ফাইল থাকবে।

আরো দেখুন


ধন্যবাদ তবে আমি দেখতে পাচ্ছি না আপনি কীভাবে আমার সমস্যাটির সমাধান করছেন। আমার কাছে, এফআরএম একটি উত্তরাধিকার ব্যবস্থা এবং একাধিক নির্দেশনা থাকা মানে আমি একাধিক বাবা-মায়ের কাছ থেকে উত্তরাধিকারী হতে পারি। আপনার উত্তরে আপনি
এফআরএম বা

1
সম্ভবত এটাই বিভ্রান্তি। FROMমূলত একটি নেমস্পেসের ঘোষণা। ওখানকার বাছাইপর্ব উত্তরাধিকারের চেয়ে বাড়ানোর মতো। আপনি একাধিক নেমস্পেস ঘোষণা করতে পারেন। এবং এই প্রতিটি নেমস্পেসগুলি অন্য একটি নাম স্থান প্রসারিত করতে পারে। @ কেকিস যদি অন্য উত্তরটি আপনার পক্ষে কাজ করে তবে তা সর্বদা এটির সাথে আঁকড়ে থাকুন।
ইভান ক্যারল
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.