কোনও চিত্রকে পরিষ্কার করার জন্য কীভাবে ডকারকে বাধ্য করবেন


811

আমি নীচের কমান্ডটি ব্যবহার করে একটি ডকার ফাইল থেকে একটি ডকার চিত্র তৈরি করেছি।

$ docker build -t u12_core -f u12_core .

আমি যখন একই কমান্ড দিয়ে এটি পুনর্নির্মাণের চেষ্টা করছি তখন এটি বিল্ড ক্যাশে যেমন ব্যবহার করছে:

Step 1 : FROM ubuntu:12.04
 ---> eb965dfb09d2
Step 2 : MAINTAINER Pavan Gupta <pavan.gupta@gmail.com>
 ---> Using cache
 ---> 4354ccf9dcd8
Step 3 : RUN apt-get update
 ---> Using cache
 ---> bcbca2fcf204
Step 4 : RUN apt-get install -y openjdk-7-jdk
 ---> Using cache
 ---> 103f1a261d44
Step 5 : RUN apt-get install -y openssh-server
 ---> Using cache
 ---> dde41f8d0904
Step 6 : RUN apt-get install -y git-core
 ---> Using cache
 ---> 9be002f08b6a
Step 7 : RUN apt-get install -y build-essential
 ---> Using cache
 ---> a752fd73a698
Step 8 : RUN apt-get install -y logrotate
 ---> Using cache
 ---> 93bca09b509d
Step 9 : RUN apt-get install -y lsb-release
 ---> Using cache
 ---> fd4d10cf18bc
Step 10 : RUN mkdir /var/run/sshd
 ---> Using cache
 ---> 63b4ecc39ff0
Step 11 : RUN echo 'root:root' | chpasswd
 ---> Using cache
 ---> 9532e31518a6
Step 12 : RUN sed -i 's/PermitRootLogin without-password/PermitRootLogin yes/' /etc/ssh/sshd_config
 ---> Using cache
 ---> 47d1660bd544
Step 13 : RUN sed 's@session\s*required\s*pam_loginuid.so@session optional pam_loginuid.so@g' -i /etc/pam.d/sshd
 ---> Using cache
 ---> d1f97f1c52f7
Step 14 : RUN wget -O aerospike.tgz 'http://aerospike.com/download/server/latest/artifact/ubuntu12'
 ---> Using cache
 ---> bd7dde7a98b9
Step 15 : RUN tar -xvf aerospike.tgz
 ---> Using cache
 ---> 54adaa09921f
Step 16 : RUN dpkg -i aerospike-server-community-*/*.deb
 ---> Using cache
 ---> 11aba013eea5
Step 17 : EXPOSE 22 3000 3001 3002 3003
 ---> Using cache
 ---> e33aaa78a931
Step 18 : CMD /usr/sbin/sshd -D
 ---> Using cache
 ---> 25f5fe70fa84
Successfully built 25f5fe70fa84

ক্যাশে দেখায় যে এয়ারস্পাইক ইনস্টল করা আছে। তবে, আমি এই চিত্রটি থেকে পাওয়া পাত্রে এটি খুঁজে পাচ্ছি না, তাই ক্যাশে ব্যবহার না করেই আমি এই চিত্রটি পুনর্নির্মাণ করতে চাই। আমি কীভাবে ডকারকে ক্যাশে ছাড়াই একটি পরিষ্কার চিত্র পুনর্নির্মাণ করতে বাধ্য করতে পারি?


10
একদিকে যেমন, আপনার সাধারণত RUNনির্দেশের সংখ্যা হ্রাস করার চেষ্টা করা উচিত ।
ট্রিপলি

4
@ ট্রিপলি আপনি ব্যাখ্যা করতে পারেন কেন?
ইয়া

9
@Ya। এটি ব্যবহৃত হত যে ডকার সর্বদা প্রতিটি RUNনির্দেশের জন্য একটি পৃথক স্তর তৈরি করে , তাই Dockerfileঅনেকগুলি RUNনির্দেশাবলীর সাথে একটি জিনোমাস পরিমাণে ডিস্কের স্থান ব্যবহার করবে; তবে সাম্প্রতিক সংস্করণগুলিতে এটি দৃশ্যত কিছুটা উন্নত হয়েছে been
ট্রিপল

আমি যখন চেষ্টা করি docker-compose up -d, আমি কোথায় ব্যবহার করতে পারি --no-cache?
ওও

@ ওও সম্ভব নয় আপনাকে প্রথমে করতে হবে docker-compose build --no-cacheএবং তারপরেdocker-compose up -d
মার্টিন মেলকা

উত্তর:


1436

একটি --no-cacheবিকল্প আছে:

docker build --no-cache -t u12_core -f u12_core .

ডকারের পুরানো সংস্করণগুলিতে আপনাকে পাস করার দরকার ছিল --no-cache=true, তবে এটি আর হয় না।


86
এছাড়াও লক্ষ করুন যে --no-cacheকাজ করে docker-compose build
ব্ল্যাকাস 25:58

41
আপনি ব্যবহার করতে পারেন --pull। এটি ডককে বেস ইমেজের সর্বশেষতম সংস্করণ পেতে বলবে। আপনার --no-cacheযদি ইতিমধ্যে বেস ইমেজ (প্রাক্তন ubuntu/latest:) থাকে এবং এটি সর্বশেষে টান দেওয়ার পর থেকে বেস চিত্রটি আপডেট করা হয়েছে তা ছাড়াও এটি প্রয়োজনীয়। ডক্সটি এখানে দেখুন
কলিন ক্রাওল

2
@ কলিনক্রোল: --pullবিকল্পটি আমার পক্ষে কৌশলটি করেছে। শুধু --no-cache, বিল্ড এখনও ভাঙ্গা। রাখুন --pullপাশাপাশি, বিল্ড কাজ! ধন্যবাদ!
এরদস-বেকন

1
যদি কেউ ডকার বিল্ডকে কল দিচ্ছেন তবে কী ধরে নেওয়া হয় না যে তারা ক্যাশে ছাড়াই পুনর্নির্মাণ করতে চান? কোন ব্যবহারের ক্ষেত্রে কেউ একটি চিত্র তৈরি করতে এবং পূর্বে নির্মিত চিত্র ব্যবহার করতে চায়? <nt> আমি কেবল একটি দিন হারিয়েছি কারণ পূর্ববর্তী বিল্ডটি নিঃশব্দে "সফল" শেষ হয়েছে এবং আমি বিল্ড স্ক্রিপ্টে আপডেটগুলি কেন কাজ করছে না তা বুঝতে না পেরে ভাঙা চিত্রটি ব্যবহার করছিলাম </ translation>
জেফ

3
@ জেফ আপনি যখন কোনও ডকার চিত্র বিকাশ করছেন, ডকার বিল্ড কেবলমাত্র স্তর / পদক্ষেপগুলি পুনরায় করতে হবে যা পরিবর্তিত হয়েছে। যদি আমার পাঁচটি পদক্ষেপ থাকে এবং আমি সূচক 3 এ একটি নতুন পদক্ষেপ যুক্ত করি, তবে পদক্ষেপ 1 এবং 2 এর সাথে যুক্ত স্তরগুলি পুনরায় ব্যবহার করা যেতে পারে। এটি ব্যাপকভাবে বিকাশ প্রক্রিয়াটিকে গতি দেয়
ফ্লাক্স

129

কিছু চরম ক্ষেত্রে, পুনরাবৃত্তি বিল্ড ব্যর্থতার চারপাশে আপনার একমাত্র উপায় হ'ল:

docker system prune

আদেশটি আপনাকে আপনার নিশ্চয়তার জন্য জিজ্ঞাসা করবে:

WARNING! This will remove:
    - all stopped containers
    - all volumes not used by at least one container
    - all networks not used by at least one container
    - all images without at least one container associated to them
Are you sure you want to continue? [y/N]

এটি অবশ্যই প্রশ্নের সরাসরি উত্তর নয়, তবে কিছু জীবন বাঁচাতে পারে ... এটি আমার বাঁচিয়েছিল।


8
-a -f যোগ করে এটি আরও ভাল করে তোলে
রবি

1
@ ইলিয়ানঅনফ্রেই আমার জন্য কাজ করেDocker version 17.09.0-ce, build afdb6d4
লন্ডবার্গে

1
@ পেরলুন্ডবার্গ, আমি dockerএকই সংস্করণে আপডেট করেছি এবং এটি কাজ করে, আপনাকে ধন্যবাদ।
আইলিয়ান ওনোফ্রেই

1
আপনি যদি সবকিছু মুছতে না চান তবে এই দৃশ্যের জন্য এটি ওভারকিল এবং ব্যবহারযোগ্য উত্তর নয়।
এম_ডিকে

1
এটি এমনকি থামানো পাত্রে চিত্রগুলি মুছবে, সম্ভবত এমন কিছু যা আপনি চান না। ডকারের সাম্প্রতিক সংস্করণগুলিতে docker builder pruneক্যাশেড বিল্ড স্তরগুলি সাফ করার জন্য কমান্ড রয়েছে । স্ট্যাক ওভারফ্লো থেকে অন্ধভাবে কমান্ড অনুলিপি করার পরে ফাঁদে পড়ে গেল।
il

58

কমান্ডটি docker build --no-cache .আমাদের অনুরূপ সমস্যার সমাধান করেছে।

আমাদের ডকফেরাইলটি ছিল:

RUN apt-get update
RUN apt-get -y install php5-fpm

তবে হওয়া উচিত ছিল:

RUN apt-get update && apt-get -y install php5-fpm

আপডেটটি ক্যাচিং প্রতিরোধ করতে এবং পৃথকভাবে ইনস্টল করুন।

দেখুন: ডকফায়াইলগুলি লেখার জন্য সেরা অনুশীলন


10
"হওয়া উচিত ছিল" বিভ্রান্তিকর। যদি ডকার দেখতে পান যে এটির একটি ক্যাশেড অনুলিপি রয়েছে RUN apt-get update && apt-get -y install php5-fpmতবে এটি পুরানো সামগ্রীগুলির সাথে পুনরায় ব্যবহার করা দেখতে পাবে।
ট্রিপলি

10
প্রকৃতপক্ষে এটি এখনও তাদের সাথে যোগ দিতে বুদ্ধি করে, কারণ অন্যথায় যদি আপনি ইনস্টলেশন লাইনটি পরিবর্তন করেন তবে এটি এখনও পুরানো প্যাকেজ ক্যাশে ব্যবহার করবে, যা ক্যাশেটির মেয়াদ শেষ হলে সাধারণত সমস্যা হয় (সাধারণত ফাইলগুলি 404 হবে))
জন চ্যাডউইক

18

আপডেটের জন্য বেস চিত্রটি পরীক্ষা সহ আপনার বিল্ডটি পুরোপুরি পুনর্নির্মাণ হয়েছে তা নিশ্চিত করতে, নির্মাণের সময় নিম্নলিখিত বিকল্পগুলি ব্যবহার করুন:

--no-cache - এটি ইতিমধ্যে উপলব্ধ স্তর পুনর্নির্মাণকে বাধ্য করবে

--pull - এটি আপনার সর্বশেষতম সংস্করণ পেয়েছে তা নিশ্চিত করে এফআরএম ব্যবহার করে রেফারেন্স করা বেস চিত্রটির একটি টান ট্রিগার করবে।

সম্পূর্ণ কমান্ডটি এর মতো দেখতে পাবেন:

docker build --pull --no-cache --tag myimage:version .

ডকার-রচনার জন্য একই বিকল্পগুলি পাওয়া যায়:

docker-compose build --no-cache --pull

13

আমি --no-cacheআপনার ক্ষেত্রে ব্যবহার করার পরামর্শ দেব না ।

আপনি পদক্ষেপ 3 থেকে 9 পর্যন্ত কয়েকটি স্থাপনা চালাচ্ছেন (আমি, যাইহোক, একটি লাইনার ব্যবহার পছন্দ করি) এবং আপনি যদি প্রতিবার নিজের ইমেজ তৈরি করতে চান তবে এই পদক্ষেপগুলি পুনরায় চালনার ওভারহেড না চাইলে আপনি পারেন Dockerfileআপনার wgetনির্দেশের পূর্বে একটি অস্থায়ী পদক্ষেপ সহ আপনার সংশোধন করুন ।

আমি ভালো কিছু করতে ব্যবহার RUN ls .করুন এবং এটি পরিবর্তন RUN ls ./তারপর RUN ls ./.এবং তাই প্রতিটি পরিমার্জন tarball রূপে দ্বারা উদ্ধার কাজ জন্যwget

আপনি অবশ্যই প্রতিটি পুনরাবৃত্তির জন্য RUN echo 'test1' > test && rm testসংখ্যা বাড়ানোর মতো কিছু করতে পারেন 'test1

এটি ময়লা দেখায়, তবে যতদূর আমি জানি এটি ডকারের ক্যাশে সিস্টেম থেকে উপকার অব্যাহত রাখার সবচেয়ে কার্যকর উপায়, আপনার যখন অনেক স্তর থাকে তখন সময় সাশ্রয় করে ...


3
নির্দিষ্ট বিন্দুর পরেও ক্যাশে ব্যবহার না করতে সক্ষম হবার দক্ষতা হ'ল অনেকের অনুরোধ করা বৈশিষ্ট্য ( ক্যাথ বস্টিংয়ের বিকল্পগুলির জন্য github.com/moby/moby/issues/1996 দেখুন )
লেজেক.হানুসz

13

ডকার-রচনার চেষ্টা সহ docker-compose up -d --build --force-recreate


5

এখানে বেশিরভাগ তথ্য সঠিক।
এখানে তাদের সংকলন এবং সেগুলি ব্যবহারের আমার পদ্ধতি।

ধারণাটি হ'ল প্রস্তাবিত পদ্ধতির সাথে লেগে থাকা (নির্দিষ্ট সজ্জিত এবং অন্যান্য সঞ্চিত ডকার বস্তুর উপর কোনও প্রভাব ফেলবে না) এবং পর্যাপ্ত না হলে আরও র‌্যাডিকাল পদ্ধতির (নির্দিষ্টভাবে নির্মিত না এবং অন্যান্য সঞ্চিত ডকার বস্তুর উপর প্রভাব সহ) চেষ্টা করা।

প্রস্তাবিত পদ্ধতির:

1) ডকফাইলে প্রতিটি পদক্ষেপ / নির্দেশনা কার্যকর করার জন্য বাধ্য করুন:

docker build --no-cache 

বা সাথে docker-compose build:

docker-compose build --no-cache

আমরা এটি upসাব-কমান্ডের সাথেও সংযুক্ত করতে পারি যা সমস্ত পাত্রে পুনরায় তৈরি করে:

docker-compose build --no-cache &&
docker-compose up -d --force-recreate 

এই উপায়ে ক্যাশে ব্যবহার করবেন না তবে ডকার নির্মাতা এবং FROMনির্দেশের সাথে উল্লেখ করা বেস চিত্রের জন্য ।

2) ডকার নির্মাতা ক্যাশে মুছুন (আমরা যদি বিল্ডকিট ব্যবহার করি তবে আমাদের খুব সম্ভবত এটির প্রয়োজন হবে):

docker builder prune -af

3) আমরা যদি পিতামাতাদের চিত্রগুলির ক্যাশে ব্যবহার করতে না চাই, আমরা সেগুলি মুছতে চাইছি যেমন:

docker image rm -f fooParentImage

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

আরও মৌলিক পদ্ধতির:

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

1) সমস্ত চিত্রের সাথে যুক্ত তাদের কমপক্ষে একটি ধারক ছাড়াই সরান:

docker image prune -a

2) আরও অনেক জিনিস সরান:

docker system prune -a

এর মানে :

সতর্কবার্তা! এটি অপসারণ করবে:
  - সব বন্ধ পাত্রে
  - সমস্ত নেটওয়ার্ক কমপক্ষে একটি ধারক দ্বারা ব্যবহৃত হয় না
  - কমপক্ষে একটি ধারকযুক্ত তাদের সাথে যুক্ত সমস্ত চিত্র
  - সমস্ত ক্যাশে বিল্ড

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


3

আপনি এর সাথে বিল্ডার ক্যাশে পরিচালনা করতে পারেন docker builder

কোনও প্রম্পট ছাড়াই সমস্ত ক্যাশে পরিষ্কার করতে: docker builder prune -af

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