শর্তসাপেক্ষ COPY / ডকফাইলে এডি?


105

আমার ডকফিলিলের ভিতরে আমি আমার চিত্রটিতে একটি ফাইল কপি করতে চাই যদি এটি বিদ্যমান থাকে তবে পাইপগুলির জন্য প্রয়োজনীয়তা.txt ফাইলটি ভাল প্রার্থীর মতো মনে হয় তবে কীভাবে এটি অর্জন করা হবে?

COPY (requirements.txt if test -e requirements.txt; fi) /destination
...
RUN  if test -e requirements.txt; then pip install -r requirements.txt; fi

বা

if test -e requirements.txt; then
    COPY requiements.txt /destination;
fi
RUN  if test -e requirements.txt; then pip install -r requirements.txt; fi

: দয়া করে এখানে দেখতে docs.docker.com/reference/builder
Tuan

4
@ টুয়ান - এই লিঙ্কে বিশেষত কোনটি এটি করতে সহায়তা করে?
টুলমেকারস্টেভ

উত্তর:


26

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

ওয়াইল্ডকার্ড ব্যবহার করে 13045 ইস্যুতে এটি এখনও অনুরোধ করা হয়েছে : " COPY foo/* bar/" not work if no file in foo" (মে 2015)।
এটি এখন (জুলাই ২০১৫) এর জন্য ডকারে প্রয়োগ করা হবে না, তবে বকারের মতো আরও একটি বিল্ড টুল এটি সমর্থন করতে পারে।


35
ভাল উত্তর, কিন্তু ডকার যুক্তি, আইএমও, ত্রুটিযুক্ত। আপনি যদি একই বিল্ড-প্রসঙ্গের সাথে একই ডকস্পাইল চালান, তবে আপনি আলাদা চিত্র পাবেন। এটা আশা করা যায়। একই বিল্ড-প্রসঙ্গটি ব্যবহার করা একই চিত্র দেবে। এবং যদি আপনি একই বিল্ড-প্রসঙ্গে শর্তাধীন কপি / এডিডি নির্দেশাবলী সন্নিবেশ করান তবে আপনি একই চিত্র পাবেন। যাতে চেক আউট। যদিও এটি আমার 2 সেন্ট মাত্র।
নাথান g

ডকার অপরিবর্তনীয় অবকাঠামো সম্পর্কে। আপনার পরিবেশ ডেভ, স্টেজিং এবং প্রোড অভিন্ন না হলে যথাসম্ভব 99.99% হওয়া উচিত। পরিবেশের ভেরিয়েবল ব্যবহার করুন।
অ্যান্ড্রুএমসিএলাগান

4
@ অ্যান্ড্রুম্যাকলাগান যদি উদাহরণস্বরূপ, কোনও ফ্রন্ট-এন্ড devপরিবেশ কোনও ওয়েবপ্যাক ডেভ সার্ভার দিয়ে চলে এবং সমতুল্য prodপরিবেশটি একটি /distস্ট্যাটিক ফোল্ডার সহ কাজ করে ? এটা হল সবচেয়ে ফ্রন্ট-এন্ড স্থাপনার আজ ক্ষেত্রে দেখা যায়, এবং স্পষ্টত devএবং prodএখানে একই হতে পারে না। তাহলে কীভাবে মোকাবেলা করবেন?
জীবন

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

@ জীবান সাধারণ নির্দেশাবলী সংজ্ঞায়িত করতে এবং তারপরে দেব এবং প্রোডের জন্য নির্দিষ্ট চিত্র তৈরির বিষয়ে অনবিল্ড ইমেজ ব্যবহার সম্পর্কে কীভাবে। ডকার হাব নোড রেপোতে প্রতিটি নোড সংস্করণ: হাব.ডোকার . com / _/ নোডের জন্য বিল্ড ইমেজ রয়েছে বলে মনে হয় । অথবা হতে পারে আপনি নিজের রোল করতে পারেন।
ডেভিড_আই_স্মিত

86

এখানে একটি সাধারণ কাজ

COPY foo file-which-may-exist* /target

নিশ্চিত করা fooCOPYকমপক্ষে একটি বৈধ উত্স প্রয়োজন যেহেতু

যদি file-which-may-existউপস্থিত থাকে, এটি কপি করা হবে।

দ্রষ্টব্য: আপনার ওয়াইল্ডকার্ড যে অনুলিপি অনুলিপি করতে চান না এমন অন্য ফাইলগুলি আপনাকে না নেবে তা নিশ্চিত করার জন্য আপনার যত্ন নেওয়া উচিত। আরও সতর্কতা অবলম্বন করতে, আপনি ব্যবহার করতে পারেনfile-which-may-exist? পরিবর্তে ( ?কেবলমাত্র একটি একক অক্ষরের সাথে মেলে)।

বা আরও ভাল, শুধুমাত্র একটি ফাইলের সাথে ম্যাচ করা যায় তা নিশ্চিত করার জন্য এটির মতো একটি অক্ষর শ্রেণি ব্যবহার করুন:

COPY foo file-which-may-exis[t] /target

4
আপনি কি ফোল্ডার দিয়ে একই জিনিস করতে পারেন?
বেনিয়ামিন তোয়েগ

4
@ বেনজামিনটাইগ: হ্যাঁ, ডক্স অনুসারে আপনি ফাইলগুলি পাশাপাশি ফোল্ডারগুলিও অনুলিপি করতে পারবেন।
jdildeb

4
এটি দুর্দান্ত কাজ করে। একাধিক গন্তব্যযুক্ত ফাইলগুলির জন্য, আমি একটি অস্থায়ী ডিরেক্টরিতে অনুলিপি করেছি এবং তারপরে তাদের প্রয়োজনীয় যেখানে সরিয়ে নিয়েছি। COPY --from=docker /usr/bin/docker /usr/lib/libltdl.so* /tmp/docker/ RUN mv /tmp/docker/docker /usr/bin/docker RUN mv /tmp/docker/libltdl.so.7 /usr/lib/libltdl.so.7 || true(যেখানে ভাগ করা লাইব্রেরিটি অজানা সত্তা))
অ্যাডাম কে ডিন

একাধিক প্রচলিত ফাইল অনুলিপি করার সময় গন্তব্য অবশ্যই একটি ডিরেক্টরি হতে হবে। যখন foo এবং আপনার ফাইল - যা -র-উপস্থিত থাকতে পারে * বিদ্যমান থাকে তখন কীভাবে এটি কাজ করবে?
melchoir55

4
সুতরাং উত্তরটি হল 'ফাইলটি আছে কিনা তা নিশ্চিত করুন' এবং তারপরে সিপিওয়াই অপারেটরটি কীভাবে ব্যবহার করবেন সে সম্পর্কে একটি প্রদর্শনী? এটি মূল প্রশ্নের সাথে কীভাবে সম্পর্কিত তা দেখতে আমি ব্যর্থ।
অবতরণ করুন

28

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

ARG BUILD_ENV=copy

FROM alpine as build_copy
ONBUILD COPY file /file

FROM alpine as build_no_copy
ONBUILD RUN echo "I don't copy"

FROM build_${BUILD_ENV}
# other stuff

ONBUILDনির্দেশাবলীর নিশ্চিত করে যে ফাইলটি শুধুমাত্র অনুলিপি করা হয়েছে যদি "শাখা" নির্বাচিত হয় BUILD_ENV। কল করার আগে সামান্য স্ক্রিপ্ট ব্যবহার করে এই ভার সেট করুনdocker build


4
আমি এই উত্তরটি পছন্দ করি কারণ এটি কেবলমাত্র অনাবিল্ডের দিকেই আমার চোখ খোলে যা অতিশয় কার্যকর নয়, তবে পাস হওয়া অন্যান্য ভেরিয়েবলগুলির সাথে একীভূত করাও সবচেয়ে সহজ বলে মনে হয়, যেমন আপনি যদি বিল্ড_ইএনভি ভিত্তিক ট্যাগটি সেট করতে চান বা কোনও রাজ্যে সঞ্চয় করতে চান ENV।
ডিউজএক্সম্যাচিনা

আমি ঠিক এর মতোই কিছু চেষ্টা করেছি এবং পেয়েছি: ডেমনের ত্রুটির প্রতিক্রিয়া: ডকফেরফিল পার্স ত্রুটি লাইন 52: বিল্ড স্টেজের অবৈধ নাম: "সাইট_বিল্ডার _ $ {হোস্ট_ইনভ}", নামটি কোনও সংখ্যার সাথে শুরু হতে পারে বা চিহ্নগুলি ধারণ করতে পারে না
পাউলেকোয়েট

10

সমাধান প্রায় কাজ

ENV ভেরিয়েবলের উপর ভিত্তি করে সার্ভারে অনুলিপি ফোল্ডারটিতে আমার দরকার ছিল। আমি খালি সার্ভার চিত্রটি নিয়েছি। স্থানীয় ফোল্ডারে প্রয়োজনীয় স্থাপনা ফোল্ডার কাঠামো তৈরি করে। তারপরে ডকারফাইলে লাইনের নীচে যুক্ত করে ফোল্ডারটি কন্টেইনারে অনুলিপি করুন। আমি শেষ পংক্তিটি ডক দ্বারা সার্ভারটি শুরু করার আগে ডাইরেক্ট ফাইল.শ চালানোর জন্য এন্ট্রি পয়েন্ট যুক্ত করেছি।

#below lines added to integrate testing framework
RUN mkdir /mnt/conf_folder
ADD install /mnt/conf_folder/install
ADD install_test /mnt/conf_folder/install_test
ADD custom-init.sh /usr/local/bin/custom-init.sh
ENTRYPOINT ["/usr/local/bin/custom-init.sh"]

তারপরে নীচের মতো কিছু স্ক্রিপ্ট সহ স্থানীয় কাস্টম- init.sh ফাইল তৈরি করুন

#!/bin/bash
if [ "${BUILD_EVN}" = "TEST" ]; then
    cp -avr /mnt/conf_folder/install_test/* /mnt/wso2das-3.1.0/
else
    cp -avr /mnt/conf_folder/install/* /mnt/wso2das-3.1.0/
fi;

ইন Docker-রচনা লাইন নিচে ফাইল।

পরিবেশ: - BUILD_EVN = পরীক্ষা

এই পরিবর্তনগুলি ডকার বিল্ডের সময় ধারকটিতে অনুলিপি করে। যখন আমরা ডকার-কমপোজ এক্সিকিউট করি এটি সার্ভার শুরুর আগে প্রকৃত প্রয়োজনীয় ফোল্ডারটি অনুলিপি করে বা সার্ভারে স্থাপন করে।


8
তবে ডকারের চিত্রগুলি স্তরযুক্ত। আপনি যে বিবৃতি উল্লেখ করেছেন তা নির্বিশেষে এগুলি চিত্রটিতে অনুলিপি করুন ...
MyUserInStackOverflow

@ মাইউজারআইনস্ট্যাক ওভারফ্লো - আমি মনে করি এই "ওয়ার্কআরাউন্ড" এর ধারণাটি হ'ল ইনস্টল এবং ইনস্টল_স্টেস্ট উভয়ই ছবিতে অনুলিপি করা হয়, তবে যখন চিত্রটি চালানো হয়, কেবলমাত্র সেই ফোল্ডারগুলির মধ্যে একটিরই চূড়ান্ত স্থানে অনুলিপি করা হয়। যদি এটি ঠিক থাকে যে উভয়ই চিত্রের কোথাও রয়েছে তবে এটি একটি যুক্তিসঙ্গত কৌশল হতে পারে।
টুলমেকারস্টেভ

5

সমস্ত ফাইল একটি নিক্ষেপ দির কাছে অনুলিপি করুন, আপনি যা চান তা বেছে নিন, বাকীটি ফেলে দিন।

COPY . /throwaway
RUN cp /throwaway/requirements.txt . || echo 'requirements.txt does not exist'
RUN rm -rf /throwaway

আপনি বিল্ড স্টেজগুলি ব্যবহার করে অনুরূপ কিছু অর্জন করতে পারেন যা cpশর্তাধীন অনুলিপি ব্যবহার করে একই সমাধানের উপর নির্ভর করে । বিল্ড স্টেজ ব্যবহার করে, আপনার চূড়ান্ত চিত্রটি প্রাথমিক থেকে সমস্ত সামগ্রী অন্তর্ভুক্ত করবে না COPY

FROM alpine as copy_stage
COPY . .
RUN mkdir /dir_for_maybe_requirements_file
RUN cp requirements.txt /dir_for_maybe_requirements_file &>- || true

FROM alpine
# Must copy a file which exists, so copy a directory with maybe one file
COPY --from=copy_stage /dir_for_maybe_requirements_file /
RUN cp /dir_for_maybe_requirements_file/* . &>- || true
CMD sh

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

@ দেউসএক্সমচিনা, আপনি ডকারের কোন সংস্করণ ব্যবহার করছেন? ডকস আপনি ডকস ডক্টর.ডওকার.ডেভলভ / ডেভলপ-ইমেজস / মাল্টিস্টেজ- বিল্ড/ … যা বলছেন তার বিরোধিতা করে । একটি চূড়ান্ত বিল্ড পর্যায় থেকে স্তরগুলি সংরক্ষণ করা উচিত নয়।
সিডোসোর্ন

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

@ ডিউসএক্সমাছিনা, ঠিক দ্বিতীয় সমাধানটি চিত্রের আকার হ্রাস করে।
সিডোসোর্ন

এটি আমার মামলার জন্য দুর্দান্ত কাজ। আমি একটি অনুলিপি cacheকরছি এবং স্ক্রিপ্ট ফাইলগুলিতে কী করা উচিত তা ক্যাশে নির্ভর করে!
পাসচালিস

1

অন্যান্য ধারণাগুলি চেষ্টা করেও কেউ আমাদের প্রয়োজন মেটেনি। শিশু স্ট্যাটিক ওয়েব অ্যাপ্লিকেশনগুলির জন্য বেস এনগিনেক্স চিত্র তৈরি করার ধারণাটি। সুরক্ষা, অপ্টিমাইজেশন এবং মানীকরণের কারণে, বেস চিত্রটি RUNশিশু চিত্র দ্বারা যুক্ত ডিরেক্টরিতে কমান্ড সক্ষম করতে হবে । শিশু চিত্র দ্বারা কোন ডিরেক্টরি যুক্ত করা হয় তা বেস চিত্রটি নিয়ন্ত্রণ করে না। অনুমান হ'ল চাইল্ড ইমেজগুলি COPYকোথাও কোথাও এর অধীনে সংস্থান করবেCOMMON_DEST_ROOT

এই পদ্ধতির একটি হ্যাক, তবে ধারণাটি হ'ল বেস চিত্রটি COPYশিশু চিত্র দ্বারা যুক্ত 1 থেকে N ডিরেক্টরিগুলির নির্দেশকে সমর্থন করবে । ARG PLACEHOLDER_FILEএবং ENV UNPROVIDED_DESTসন্তুষ্ট করতে ব্যবহার করা হয় <src>এবং <dest>কোনও COPYনির্দেশের প্রয়োজন নেই।

#
# base-image:01
#
FROM nginx:1.17.3-alpine
ENV UNPROVIDED_DEST=/unprovided
ENV COMMON_DEST_ROOT=/usr/share/nginx/html
ONBUILD ARG PLACEHOLDER_FILE
ONBUILD ARG SRC_1
ONBUILD ARG DEST_1
ONBUILD ARG SRC_2
ONBUILD ARG DEST_2
ONBUILD ENV SRC_1=${SRC_1:-PLACEHOLDER_FILE}
ONBUILD ENV DEST_1=${DEST_1:-${UNPROVIDED_DEST}}
ONBUILD ENV SRC_2=${SRC_2:-PLACEHOLDER_FILE}
ONBUILD ENV DEST_2=${DEST_2:-${UNPROVIDED_DEST}}

ONBUILD COPY ${SRC_1} ${DEST_1}
ONBUILD COPY ${SRC_2} ${DEST_2}

ONBUILD RUN sh -x \
    #
    # perform operations on COMMON_DEST_ROOT
    #
    && chown -R limited:limited ${COMMON_DEST_ROOT} \
    #
    # remove the unprovided dest
    #
    && rm -rf ${UNPROVIDED_DEST}

#
# child image
#
ARG PLACEHOLDER_FILE=dummy_placeholder.txt
ARG SRC_1=app/html
ARG DEST_1=/usr/share/nginx/html/myapp
FROM base-image:01

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

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