Cómo reducir el tamaño de la imagen de Docker

12

Tengo un contenedor con GlassFish. Cuando intenté cometer una imagen, se convirtió en 14 GB. Más tarde, eliminé /tmp/en el contenedor que tenía 10 GB e intenté confirmar una imagen, pero aún así la imagen es de 14 GB. Parece que eliminar archivos del contenedor no se refleja en el tamaño de la imagen. ¿Cómo soluciono este problema?

usuario1726453
fuente
1
Nadie puede realmente hacer ninguna recomendación sin saber un poco más sobre su configuración. ¿Qué es el Dockerfile? ¿Cuál es el árbol de archivos que se agrega al contexto de compilación de Docker? La glassfishimagen oficial de Docker es de aproximadamente 1 GB. Si bien es bastante grande para una imagen de Docker, sigue siendo mucho más pequeña de lo que parece estar construyendo.
Andy Shinn
Vea esta pregunta SO para obtener un tutorial. Además, esta búsqueda en Google tiene varios artículos relevantes.
Misha Brukman

Respuestas:

9

El problema que puede enfrentar es que eliminar archivos en una confirmación no cambia el hecho de que el archivo estaba allí en una imagen anterior, por lo que la imagen anterior sigue siendo 14G.

Eche un vistazo a la parte "Capas" en este artículo: http://woudenberg.io/reducing-docker-image-size/

Para resolver ese problema, debe eliminar las cosas debajo de / tmp / dentro de la confirmación original que las generó, por lo que la imagen creada como resultado de esa confirmación no las incluye. Eso es fácil cuando se usan dockerfiles pero no está seguro si es posible al crear imágenes con commits.

Otra cosa que puede hacer es aplastar capas exportando / importando la imagen.

Juan Antonio Galán Martínez
fuente
4

Ampliando la respuesta de @Juan Antonio, Dockerfilehacer esto no ahorrará espacio:

RUN apt-get install -y foo bar
...
RUN apt-get purge --auto-remove -y foo bar

Lo que debes hacer en su lugar es:

RUN apt-get install -y foo bar && \
    && ... \
    && apt-get purge --auto-remove -y foo bar

En el lado negativo, esto significa menos almacenamiento en caché, ya que si algo cambia en esa línea de comando grande, Docker tendrá que volver a ejecutar todo el conjunto de comandos.

Wernight
fuente