Como gerar um Dockerfile de uma imagem?

É possível gerar um Dockerfile a partir de uma imagem? Eu quero saber por dois motivos:

  1. Eu posso baixar imagens do repository, mas gostaria de ver a receita que as gerou.

  2. Eu gosto da ideia de salvar snapshots, mas quando terminar, seria bom ter um formato estruturado para revisar o que foi feito.

Para entender como uma imagem do docker foi construída, use o comando docker history --no-trunc .

Você pode criar um arquivo docker a partir de uma imagem, mas ela não conterá tudo o que você gostaria de entender completamente como a imagem foi gerada. Razoavelmente, o que você pode extrair são as partes MAINTAINER, ENV, EXPOSE, VOLUME, WORKDIR, ENTRYPOINT, CMD e ONBUILD do dockerfile.

O script a seguir deve funcionar para você:

 #!/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" 

Eu uso isso como parte de um script para recriar contêineres em execução como imagens: https://github.com/docbill/docker-scripts/blob/master/docker-rebase

O Dockerfile é útil principalmente se você quiser reempacotar uma imagem.

O que você deve ter em mente é que uma imagem do docker pode, na verdade, ser apenas o backup de tar de uma máquina real ou virtual. Eu fiz várias imagens docker dessa maneira. Até mesmo o histórico de compilation mostra-me a importação de um enorme arquivo tar como o primeiro passo na criação da imagem …

Atualizar:

Cite o comentário de @ aleung:

centurylink/dockerfile-from-image não funciona com a nova versão do docker. Este aqui funciona para mim: hub.docker.com/r/chenzj/dfimage

Como gerar um Dockerfile de uma imagem?

Você pode.

Primeiro caminho

 $ 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]  -f, --full-tree Generate Dockerfile for all parent layers -h, --help Show this message 

Aqui está o exemplo para gerar o Dockerfile a partir de uma imagem existente selenium/node-firefox-debug

 core@core-01 ~ $ docker pull centurylink/dockerfile-from-image core@core-01 ~ $ alias dfimage="docker run -v /var/run/docker.sock:/var/run/docker.sock --rm centurylink/dockerfile-from-image" core@core-01 ~ $ dfimage selenium/node-firefox-debug ADD file:b43bf069650bac07b66289f35bfdaf474b6b45cac843230a69391a3ee342a273 in / RUN 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 RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list CMD ["/bin/bash"] MAINTAINER Selenium  RUN echo "deb http://archive.ubuntu.com/ubuntu trusty main universe\n" > /etc/apt/sources.list && echo "deb http://archive.ubuntu.com/ubuntu trusty-updates main universe\n" >> /etc/apt/sources.list RUN apt-get update -qqy && apt-get -qqy --no-install-recommends install ca-certificates openjdk-7-jre-headless unzip wget && rm -rf /var/lib/apt/lists/* && sed -i 's/\/dev\/urandom/\/dev\/.\/urandom/' ./usr/lib/jvm/java-7-openjdk-amd64/jre/lib/security/java.security RUN mkdir -p /opt/selenium && wget --no-verbose http://selenium-release.storage.googleapis.com/2.46/selenium-server-standalone-2.46.0.jar -O /opt/selenium/selenium-server-standalone.jar RUN sudo useradd seluser --shell /bin/bash --create-home && sudo usermod -a -G sudo seluser && echo 'ALL ALL = (ALL) NOPASSWD: ALL' >> /etc/sudoers && echo 'seluser:secret' | chpasswd MAINTAINER Selenium  ENV DEBIAN_FRONTEND=noninteractive ENV DEBCONF_NONINTERACTIVE_SEEN=true ENV TZ=US/Pacific RUN echo "US/Pacific" | sudo tee /etc/timezone && dpkg-reconfigure --frontend noninteractive tzdata RUN apt-get update -qqy && apt-get -qqy install xvfb && rm -rf /var/lib/apt/lists/* COPY file:335d2f6f9bfe311d2b38034ceab3b2ae2a1e07b9b203b330cac9857d6e17c148 in /opt/bin/entry_point.sh RUN chmod +x /opt/bin/entry_point.sh ENV SCREEN_WIDTH=1360 ENV SCREEN_HEIGHT=1020 ENV SCREEN_DEPTH=24 ENV DISPLAY=:99.0 USER [seluser] CMD ["/opt/bin/entry_point.sh"] MAINTAINER Selenium  USER [root] RUN apt-get update -qqy && apt-get -qqy --no-install-recommends install firefox && rm -rf /var/lib/apt/lists/* COPY file:52a2a815e3bb6b85c5adfbceaabb5665b63f63ef0fb0e3f774624ee399415f84 in /opt/selenium/config.json USER [seluser] MAINTAINER Selenium  USER [root] RUN apt-get update -qqy && apt-get -qqy install x11vnc && rm -rf /var/lib/apt/lists/* && mkdir -p ~/.vnc && x11vnc -storepasswd secret ~/.vnc/passwd ENV LANGUAGE=en_US.UTF-8 ENV LANG=en_US.UTF-8 RUN locale-gen en_US.UTF-8 && dpkg-reconfigure --frontend noninteractive locales && apt-get update -qqy && apt-get -qqy --no-install-recommends install language-pack-en && rm -rf /var/lib/apt/lists/* RUN apt-get update -qqy && apt-get -qqy --no-install-recommends install fonts-ipafont-gothic xfonts-100dpi xfonts-75dpi xfonts-cyrillic xfonts-scalable && rm -rf /var/lib/apt/lists/* RUN apt-get update -qqy && apt-get -qqy install fluxbox && rm -rf /var/lib/apt/lists/* COPY file:90e3a7f757c3df44d541b59234ad4ca996f799455eb8d426218619b244ebba68 in /opt/bin/entry_point.sh RUN chmod +x /opt/bin/entry_point.sh EXPOSE 5900/tcp 

Outra maneira, que você não precisa puxar a imagem para local e nenhum comando precisa ser executado.

Use a imagem acima como exemplo, você pode obter comandos Dockerfile via URL abaixo:

https://imagelayers.io/?images=selenium%2Fnode-firefox-debug:latest

Aguarde um pouco, haverá duas janelas, a janela de cima lista as camadas, a janela de baixo lista o comando no Dockerfile

imagelayers.io tela

O formato da URL é:

 https://imagelayers.io/?images=%2F: 

Em face, imagelayers.io é construído por Centurylink

De alguma forma, eu absolutamente perdi o comando real na resposta aceita, então aqui está novamente, um pouco mais visível em seu próprio parágrafo, para ver quantas pessoas são como eu

 $ docker history --no-trunc  

Não é possível neste momento (a menos que o autor da imagem inclua explicitamente o Dockerfile).

No entanto, é definitivamente algo útil! Há duas coisas que ajudarão a obter esse recurso.

  1. Construções confiáveis ​​(detalhadas nesta discussão do docker-dev
  2. Metadados mais detalhados nas imagens sucessivas produzidas pelo processo de construção. No longo prazo, os metadados devem indicar qual comando de criação produziu a imagem, o que significa que será possível reconstruir o Dockerfile a partir de uma seqüência de imagens.

Uma solução bash:

 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]*[kMG]*B\s*$,,g' | head -n -1 

Explicações passo a passo:

 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]*[kMG]*B\s*$,,g' remove layer size information head -n -1 remove last line ("SIZE COMMENT" in this case) 

Exemplo:

  ~  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"] 

Você pode usar o Portainer.io https://portainer.io/

É um aplicativo da web que é executado dentro de um contêiner do Docker usado para gerenciar todas as coisas (quase) sobre seus contêineres. Até mesmo recepies de imagens.

Intereting Posts