tag library imagenes hub dockers container compose docker

library - ¿Cómo aplanar una imagen de Docker?



dockers container download (3)

A partir de Docker 1.13, puede utilizar el indicador --squash .

Antes de la versión 1.13:

Que yo sepa, no puedes usar la API de Docker. docker export y la docker import están diseñadas para este escenario, como usted mismo ya mencionó.

Si no desea guardar en el disco, probablemente podría canalizar la secuencia de salida de la exportación en la secuencia de entrada de la importación. No he probado esto, pero intente

docker export red_panda | docker import - exampleimagelocal:new

Hice un contenedor Docker que es bastante grande. Cuando confío el contenedor para crear una imagen, la imagen es de aproximadamente 7.8 GB. Pero cuando export el contenedor (¡no save la imagen!) A un archivo comprimido y lo vuelvo a importar, la imagen solo tiene 3 GB de tamaño. Por supuesto, la historia se ha perdido, pero esto está bien para mí, ya que la imagen está "terminada" en mi opinión y lista para su implementación.

¿Cómo puedo aplanar una imagen / contenedor sin exportarla al disco y volver a importarla? Y: ¿Es una buena idea hacer eso o me estoy perdiendo algún punto importante?


Ahora que Docker ha lanzado las compilaciones de varias etapas en 17.05, puedes reformatear tu compilación para que se vea así:

FROM buildimage as build # your existing build steps here FROM scratch COPY --from=build / / CMD ["/your/start/script"]

El resultado será que las capas de su entorno de compilación se almacenan en caché en el servidor de compilación, pero solo existirá una copia aplanada en la imagen resultante que usted etiqueta y empuja.

Tenga en cuenta que, por lo general, debería reformular esto para tener un entorno de compilación complejo y copiar solo unos pocos directorios. Aquí hay un ejemplo con Go para crear una única imagen binaria desde el código fuente y un solo comando de compilación sin instalar Go en el host y compilar fuera de la ventana acoplable:

$ cat Dockerfile ARG GOLANG_VER=1.8 FROM golang:${GOLANG_VER} as builder WORKDIR /go/src/app COPY . . RUN go-wrapper download RUN go-wrapper install FROM scratch COPY --from=builder /go/bin/app /app CMD ["/app"]

El archivo go es un simple hola mundo:

$ cat hello.go package main import "fmt" func main() { fmt.Printf("Hello, world./n") }

La compilación crea ambos entornos, el entorno de compilación y el de cero, y luego etiqueta el de cero:

$ docker build -t test-multi-hello . Sending build context to Docker daemon 4.096kB Step 1/9 : ARG GOLANG_VER=1.8 ---> Step 2/9 : FROM golang:${GOLANG_VER} as builder ---> a0c61f0b0796 Step 3/9 : WORKDIR /go/src/app ---> Using cache ---> af5177aae437 Step 4/9 : COPY . . ---> Using cache ---> 976490d44468 Step 5/9 : RUN go-wrapper download ---> Using cache ---> e31ac3ce83c3 Step 6/9 : RUN go-wrapper install ---> Using cache ---> 2630f482fe78 Step 7/9 : FROM scratch ---> Step 8/9 : COPY --from=builder /go/bin/app /app ---> Using cache ---> 5645db256412 Step 9/9 : CMD /app ---> Using cache ---> 8d428d6f7113 Successfully built 8d428d6f7113 Successfully tagged test-multi-hello:latest

Al mirar las imágenes, solo el binario único está en la imagen que se envía, mientras que el entorno de compilación tiene más de 700 MB:

$ docker images | grep 2630f482fe78 <none> <none> 2630f482fe78 6 days ago 700MB $ docker images | grep 8d428d6f7113 test-multi-hello latest 8d428d6f7113 6 days ago 1.56MB

Y sí, corre:

$ docker run --rm test-multi-hello Hello, world.