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.
Construye la imagen con la bandera --squash
:
También considere limpiar los archivos innecesarios, como el caché apt:
EJECUTAR apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*