কিভাবে একটি ইমেজ থেকে একটি ডকফেরিল তৈরি করতে?


241

কোনও চিত্র থেকে কোনও ডকফেরিল তৈরি করা সম্ভব? আমি দুটি কারণে জানতে চাই:

  1. আমি সংগ্রহশালা থেকে চিত্রগুলি ডাউনলোড করতে পারি তবে তাদের তৈরি করা রেসিপিটি দেখতে চাই।

  2. আমি স্ন্যাপশটগুলি সংরক্ষণ করার ধারণাটি পছন্দ করি তবে আমার কাজটি শেষ হয়ে গেলে কী হয়েছিল তা পর্যালোচনা করার জন্য একটি কাঠামোগত বিন্যাসটি দেওয়া ভাল হবে।


আপনি Portainer.io Portainer.io ব্যবহার করতে পারেন এটি একটি ওয়েব অ্যাপ্লিকেশন যা আপনার ধারক সম্পর্কে সমস্ত (প্রায়) স্টাফ পরিচালনা করার জন্য ব্যবহৃত ডকারের ধারকের ভিতরে চলে। এমনকি চিত্র অভ্যর্থনা।
ভিনসেন্ট

উত্তর:


98

কীভাবে কোনও চিত্র থেকে ডকফেরিল উত্পন্ন বা বিপরীত করা যায়?

আপনি পারেন।

alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm alpine/dfimage"
dfimage -sV=1.36 nginx:latest

এটি লক্ষ্যযুক্ত ডকার চিত্রটি স্বয়ংক্রিয়ভাবে এবং রফতানি করবে Dockerfile। প্যারামিটার -sV=1.36সবসময় প্রয়োজন হয় না।

তথ্যসূত্র: https://hub.docker.com/repository/docker/alpine/dfimage

নীচে পুরানো উত্তর, এটি আর কাজ করে না।

$ docker pull centurylink/dockerfile-from-image
$ alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm centurylink/dockerfile-from-image"
$ dfimage --help
Usage: dockerfile-from-image.rb [options] <image_id>
    -f, --full-tree                  Generate Dockerfile for all parent layers
    -h, --help                       Show this message

3
এটি ডকার উপায় এবং নির্বাচিত উত্তর হিসাবে চিহ্নিত করা উচিত।
কীটব্লাব

2
@ জেনসন এটি একদম ঠিক নয়, এটি 95% কভার করতে পারে। তবে স্কোয়াশেড ইমেজ নিয়ে কাজ করে না।
BMW

5
@ বিএমডাব্লু আপনি দয়া করে আপনার উদাহরণ থেকে ইমেজটি চালানো এই সমস্যার সমাধান করতে সহায়তা করতে পারেন? /usr/lib/ruby/gems/2.2.0/gems/excon-0.45.4/lib/excon/unix_sket.rb:14:in `কানেক্ট_নলবক ': সংযোগ প্রত্যাখ্যান করা হয়েছে - / var / রান / ডকারের জন্য সংযুক্ত (2) .sock (এরনো :: একনারেফিউজড) (এক্সকন :: ত্রুটিগুলি: সকেট এরির)
দীর্ঘ

8
সেঞ্চলিঙ্ক / ডকফাইফাইল-থেকে-চিত্রটি নতুন সংস্করণ ডকারের সাথে কাজ করে না। এটি আমার জন্য কাজ করে: hub.docker.com/r/chenzj/dfimage
11

6
ইমেজলেয়ার্স.আইও ভেঙে গেছে বলে মনে হচ্ছে। এটি এর
ডেমোগুলি

165

কীভাবে ডকার চিত্রটি নির্মিত হয়েছিল তা বুঝতে, docker history --no-truncকমান্ডটি ব্যবহার করুন ।

আপনি একটি চিত্র থেকে একটি ডকার ফাইল তৈরি করতে পারেন, তবে এতে চিত্রটি কীভাবে তৈরি হয়েছিল তা আপনি পুরোপুরি বুঝতে চাইবেন এমন সমস্ত কিছু থাকবে না। যুক্তিসঙ্গতভাবে আপনি যা নিষ্কাশন করতে পারবেন তা হ'ল মেইনটাইনার, ENV, এক্সপোজ, ভলিউম, ওয়ার্কির, ENTRYPOINT, সিএমডি এবং ডকফাইলের ওনবিল্ড অংশ।

নিম্নলিখিত স্ক্রিপ্ট আপনার জন্য কাজ করা উচিত:

#!/bin/bash
docker history --no-trunc "$1" | \
sed -n -e 's,.*/bin/sh -c #(nop) \(MAINTAINER .*[^ ]\) *0 B,\1,p' | \
head -1
docker inspect --format='{{range $e := .Config.Env}}
ENV {{$e}}
{{end}}{{range $e,$v := .Config.ExposedPorts}}
EXPOSE {{$e}}
{{end}}{{range $e,$v := .Config.Volumes}}
VOLUME {{$e}}
{{end}}{{with .Config.User}}USER {{.}}{{end}}
{{with .Config.WorkingDir}}WORKDIR {{.}}{{end}}
{{with .Config.Entrypoint}}ENTRYPOINT {{json .}}{{end}}
{{with .Config.Cmd}}CMD {{json .}}{{end}}
{{with .Config.OnBuild}}ONBUILD {{json .}}{{end}}' "$1"

আমি চিত্র হিসাবে চলমান পাত্রগুলি পুনর্নির্মাণের জন্য এটি কোনও স্ক্রিপ্টের অংশ হিসাবে ব্যবহার করি: https://github.com/docbill/docker-scriptts/blob/master/docker-rebase

আপনি যদি কোনও চিত্র পুনঃস্থাপন করতে সক্ষম হতে চান তবে ডকফেরাইলটি মূলত কার্যকর।

মনে রাখা জিনিস, একটি ডকার ইমেজ আসলে একটি বাস্তব বা ভার্চুয়াল মেশিনের টার ব্যাকআপ হতে পারে। আমি এভাবে বেশ কয়েকটি ডকারের চিত্র তৈরি করেছি। এমনকি বিল্ড ইতিহাস আমাকে চিত্র তৈরির প্রথম পদক্ষেপ হিসাবে একটি বিশাল ট্যারি ফাইল আমদানি করে দেখায় ...


1
টাইপ types.ContainerJSON এর যান মান মধ্যে unmarshal পারব না অ্যারে: এটা আমাকে পায়: JSON
মোহসেন

আপনি আপনার শেষ মন্তব্যটি আরও বিস্তারিতভাবে বর্ণনা করতে পারেন? সমস্ত কিছু কি কেবলমাত্র সাধারণ হিসাবে রাখা হয়? নাকি বিশেষ কোন মামলা রয়েছে?
রবার্ট লগ

আমি মনে করি এটি একটি 6yo উত্তর, তবে আমি পাচ্ছিError response from daemon: page not found
জোও সিকোকা

53

আমি কোনওভাবে গ্রহণযোগ্য উত্তরে আসল কমান্ডটি একেবারে মিস করেছি, সুতরাং এখানে আমার নিজের মতো কত লোক রয়েছে তা দেখার জন্য এটি আবার তার নিজস্ব অনুচ্ছেদে আরও কিছুটা দৃশ্যমান হয়েছে

$ docker history --no-trunc <IMAGE_ID>

1
তাহলে আমাদের কেন দরকার ub.docker.com/r/chenzj/dfimage? এটি আরও সাম্প্রতিক উত্তর।
lucid_dreamer

3
আমার ধারণা, কারণ docker historyডকফেরিল লাইনগুলি বিপরীত ক্রমে মুদ্রণ করে এবং এটি RUNনির্দেশাবলী (আপনি কেবল কমান্ডটি RUNপেয়ে থাকেন, এর সামনে কী-ওয়ার্ডটি না পেয়ে ) এবং অন্যান্য স্টাফগুলি ড্রপ করে , সুতরাং আপনাকে বিল্ডেবল ডকফেরলে যাওয়ার জন্য আপনাকে ম্যানুয়ালি এডিট করতে হবে। অন্য সরঞ্জামটি আপনার জন্য এই সম্পাদনাটি স্বয়ংক্রিয়ভাবে করতে পারে (আমি এটি চেষ্টা করি নি, তাই আমি জানি না))
ব্যবহারকার 7610

@ ইউজার 7610 আপনার কমান্ডটি হাব থেকে টানা চিত্রের ইতিহাস দেখায়। আমি কীভাবে আমার কমান্ডগুলি ডকার চিত্রগুলিতে দেখতে পারি?
বারজানহায়তি

@ বারজানহায়াতি আপনি কি এটি একটি নতুন প্রশ্ন হিসাবে জিজ্ঞাসা করতে এবং এখানে লিঙ্ক করতে পারেন? জিজ্ঞাসা করার সময় খুব নির্দিষ্ট হতে হবে। চিত্রটি শুরু করতে কমান্ডটি প্রদর্শন করুন, তারপরে আপনি দেখতে চান এমন কয়েকটি কমান্ড জারি করুন, উদাহরণস্বরূপ, তারপর ধারকটি বন্ধ করুন (যদি আপনি বাস্তবে এটিই করেন তবে) এবং জারি হওয়া আদেশগুলি কীভাবে পুনরুদ্ধার করবেন তা জিজ্ঞাসা করুন। ধন্যবাদ।
ব্যবহারকারী 7610

1
@ ব্যবহারকারী 7610 আমি এটি জিজ্ঞাসা করতে পারি, তবে আমি এটি জিজ্ঞাসা করার সাথে সাথে অবশ্যই এটি মুছে ফেলতে হবে কারণ অন্যান্য ব্যবহারকারীরা আমাকে বারবার প্রশ্নের জন্য বিয়োগ পয়েন্ট দেয়।
বার্জনহায়াটি 12:39

35

একটি বাশ সমাধান:

docker history --no-trunc $argv  | tac | tr -s ' ' | cut -d " " -f 5- | sed 's,^/bin/sh -c #(nop) ,,g' | sed 's,^/bin/sh -c,RUN,g' | sed 's, && ,\n  & ,g' | sed 's,\s*[0-9]*[\.]*[0-9]*\s*[kMG]*B\s*$,,g' | head -n -1

ধাপে ধাপে ব্যাখ্যা:

tac : reverse the file
tr -s ' '                                       trim multiple whitespaces into 1
cut -d " " -f 5-                                remove the first fields (until X months/years ago)
sed 's,^/bin/sh -c #(nop) ,,g'                  remove /bin/sh calls for ENV,LABEL...
sed 's,^/bin/sh -c,RUN,g'                       remove /bin/sh calls for RUN
sed 's, && ,\n  & ,g'                           pretty print multi command lines following Docker best practices
sed 's,\s*[0-9]*[\.]*[0-9]*\s*[kMG]*B\s*$,,g'      remove layer size information
head -n -1                                      remove last line ("SIZE COMMENT" in this case)

উদাহরণ:

 ~  dih ubuntu:18.04
ADD file:28c0771e44ff530dba3f237024acc38e8ec9293d60f0e44c8c78536c12f13a0b in /
RUN set -xe
   &&  echo '#!/bin/sh' > /usr/sbin/policy-rc.d
   &&  echo 'exit 101' >> /usr/sbin/policy-rc.d
   &&  chmod +x /usr/sbin/policy-rc.d
   &&  dpkg-divert --local --rename --add /sbin/initctl
   &&  cp -a /usr/sbin/policy-rc.d /sbin/initctl
   &&  sed -i 's/^exit.*/exit 0/' /sbin/initctl
   &&  echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup
   &&  echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean
   &&  echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean
   &&  echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean
   &&  echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages
   &&  echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes
   &&  echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests
RUN rm -rf /var/lib/apt/lists/*
RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list
RUN mkdir -p /run/systemd
   &&  echo 'docker' > /run/systemd/container
CMD ["/bin/bash"]

1
সবচেয়ে সহজ সমাধান। ধন্যবাদ!
ব্যবহারকারী 3576508

মাল্টিলাইন RUN স্টেটমেন্ট ভেঙে এটি কোনও পিছনের ব্যাকস্ল্যাশ যুক্ত করে না। আমি এর দ্বারা অনুপ্রাণিত আমার নিজের উত্তর যুক্ত করেছি।
স্কট সেন্টোনি

ট্যাক ম্যাকের জন্য উপলভ্য নয়, সুতরাং আপনি নীচের মতো কব্জায় যেতে পারেন: | awk '{প্রিন্ট এনআর, $ 0}' | সাজানো -এনআর | সেড এর / ^ [0-9] * // '|
ফুলেই

11

এই মুহুর্তে এটি সম্ভব নয় (যদি না ছবিটির লেখক স্পষ্টভাবে ডকফাইফিলকে অন্তর্ভুক্ত করেন)।

তবে এটি অবশ্যই কার্যকর কিছু! দুটি বৈশিষ্ট্য যা এই বৈশিষ্ট্যটি পেতে সহায়তা করবে।

  1. বিশ্বস্ত বিল্ডস ( এই ডকার-দেব আলোচনায় বিশদভাবে)
  2. বিল্ড প্রক্রিয়া দ্বারা উত্পাদিত ধারাবাহিক চিত্রগুলিতে আরও বিশদ মেটাডেটা। দীর্ঘমেয়াদে, মেটাডাটাটি নির্দেশ করে যে কোন বিল্ড কমান্ড চিত্রটি তৈরি করেছে, যার অর্থ এটি চিত্রের ক্রম থেকে ডকফেরফিল পুনর্গঠন করা সম্ভব হবে।

8

বিএমডাব্লু এর উত্তরে ডিসেম্বর 2018 আপডেট করুন

docker pull chenzj/dfimage
alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm chenzj/dfimage"
dfimage IMAGE_ID > Dockerfile

6

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

#!/bin/bash
case "$OSTYPE" in
    linux*)
        docker history --no-trunc --format "{{.CreatedBy}}" $1 | # extract information from layers
        tac                                                    | # reverse the file
        sed 's,^\(|3.*\)\?/bin/\(ba\)\?sh -c,RUN,'             | # change /bin/(ba)?sh calls to RUN
        sed 's,^RUN #(nop) *,,'                                | # remove RUN #(nop) calls for ENV,LABEL...
        sed 's,  *&&  *, \\\n \&\& ,g'                           # pretty print multi command lines following Docker best practices
    ;;
    darwin*)
        docker history --no-trunc --format "{{.CreatedBy}}" $1 | # extract information from layers
        tail -r                                                | # reverse the file
        sed -E 's,^(\|3.*)?/bin/(ba)?sh -c,RUN,'               | # change /bin/(ba)?sh calls to RUN
        sed 's,^RUN #(nop) *,,'                                | # remove RUN #(nop) calls for ENV,LABEL...
        sed $'s,  *&&  *, \\\ \\\n \&\& ,g'                      # pretty print multi command lines following Docker best practices
    ;;
    *)
        echo "unknown OSTYPE: $OSTYPE"
    ;;
esac

5

docker pull chenzj/dfimage


alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm chenzj/dfimage"

dfimage image_id

নীচে ডিফিমেজ কমান্ডের আউটপুট দেওয়া হল: -

f dfimage 0f1947a021ce

নোড থেকে: 8 ওয়ার্কডির / ইউএসআর / এসসিআর / অ্যাপ্লিকেশন

কপি ফাইল: e76d2e84545dedbe901b7b7b0c8d2c9733baa07cc821054efec48f623e29218c ইন

RUN / বিন / sh -c এনপিএম ইনস্টল করুন

কপি দির: এ 89 এ 4894689a38cbf3895fdc0870878272bb9e09268149a87a6974a274b2184a ইন।

8080 এক্সপোজ

সিএমডি ["এনপিএম" "শুরু"]

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