subir - ¿Cómo generar un Dockerfile a partir de una imagen?
imagen docker ubuntu (4)
Actualizar:
Cita del comentario de @ aleung:
centurylink/dockerfile-from-image
no funciona con la nueva versión docker. Este funciona para mí: hub.docker.com/r/chenzj/dfimage
¿Cómo generar un Dockerfile a partir de una imagen?
Usted puede.
Primera forma
$ 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
Aquí está el ejemplo para generar Dockerfile a partir de una imagen 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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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 <[email protected]>
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
Otra forma, que no necesita extraer la imagen a local y sin necesidad de ejecutar ningún comando.
Utilice la imagen de arriba como muestra, puede obtener los comandos de Dockerfile a través de la siguiente URL:
https://imagelayers.io/?images=selenium%2Fnode-firefox-debug:latest
Espere un momento, habrá dos ventanas, la ventana de arriba enumera las capas, la ventana de abajo enumera el comando en Dockerfile
El formato de URL es:
https://imagelayers.io/?images=<USER>%2F<IMAGE>:<TAG>
En face, imagelayers.io es construido por Centurylink
¿Es posible generar un Dockerfile a partir de una imagen? Quiero saber por dos razones:
Puedo descargar imágenes del repositorio pero me gustaría ver la receta que las generó.
Me gusta la idea de guardar instantáneas, pero una vez que haya terminado, sería bueno tener un formato estructurado para revisar lo que se hizo.
De alguna manera, me perdí completamente el comando real en la respuesta aceptada, así que aquí está de nuevo, un poco más visible en su propio párrafo, para ver cuántas personas son como yo
$ docker history --no-trunc <IMAGE_ID>
No es posible en este punto (a menos que el autor de la imagen incluya explícitamente el archivo Docker).
Sin embargo, definitivamente es algo útil. Hay dos cosas que ayudarán a obtener esta característica.
- Creaciones de confianza (detalladas en esta discusión de docker-dev
- Metadatos más detallados en las imágenes sucesivas producidas por el proceso de compilación. A largo plazo, los metadatos deberían indicar qué comando de compilación produjo la imagen, lo que significa que será posible reconstruir Dockerfile a partir de una secuencia de imágenes.
Para entender cómo se construyó una imagen de portón, use el comando docker history --no-trunc
.
Puede construir un archivo acoplable desde una imagen, pero no contendrá todo lo que desee para comprender completamente cómo se generó la imagen. Razonablemente, lo que puede extraer son las partes MANTENEDOR, ENV, EXPONER, VOLUMEN, PÁGINA DE TRABAJO, PUNTO DE PARTIDA, CMD y ENTRADA del archivo docker.
La siguiente secuencia de comandos debería funcionar para usted:
#!/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"
Utilizo esto como parte de un script para reconstruir contenedores en ejecución como imágenes: https://github.com/docbill/docker-scripts/blob/master/docker-rebase
El archivo Docker es principalmente útil si desea poder volver a empaquetar una imagen.
Lo que hay que tener en cuenta es que una imagen de portador puede ser la copia de seguridad de una máquina real o virtual. He hecho varias imágenes de docker de esta manera. Incluso el historial de compilación muestra que la importación de un archivo tar enorme es el primer paso para crear la imagen ...