DockerMultiStage
Poder optimizar el tamaño de las imágenes de los contenedores para aplicaciones realizadas en Dot Net Core.
Para comenzar creamos una simple aplicacion de consola "Hola Mundo".
> dotnet new console
Para crear la imagen de esta aplicacion en Docker utilizamos el siguiente DockerFile:
FROM microsoft/dotnet:2.2-sdk
COPY . ./docker-test
WORKDIR /docker-test/
RUN dotnet build -c Release
ENTRYPOINT ["dotnet", "run", "-c", "Release", "--no-build"]
Veamos linea a linea lo que se realiza aca. En primer lugar utilizamos como imagen base la version que contine el sdk de DotNet Core 2.2 [https://hub.docker.com/r/microsoft/dotnet] como debemos compilar nuestra aplicación.
Luego con "COPY . ./docker-test" copiamos nuestro codigo a la imagen de docker.
Nos posicionamos donde esta el codigo de nuestra aplicación.
Finalmente definimos como se debe iniciar nuestra aplicación.
Ahora creamos nuestra imagen con nombre docker-test
> docker build -t docker-test .
Si no tenemos la imagen base este proceso va tardar unos minutos dado que debe descargarla y luego genera nuestra imagen.
si vemos que tenemos como imagenes con : docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker-test latest 8e0d17fcfbbb 2 hours ago 1.74GB
1.74 GB que deberia ser utilizada solo para un Hola Mundo !!!, ahora con MultiStage se puede utilizar una imagen para "compilar" y otra imagen para correr la aplicación que por supuesto utiliza mucho menos espacio.
FROM microsoft/dotnet:2.2-sdk AS build
COPY . ./docker-test
WORKDIR /docker-test/
RUN dotnet build -c Release -o output
FROM microsoft/dotnet:2.2-runtime AS runtime
COPY --from=build /docker-test/output .
ENTRYPOINT ["dotnet", "docker-test.dll"]
con esto logramos que la imagen de la aplicacion sea de solo 180 MG
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 63fb9180b95b 2 minutes ago 180MB
Podriamos pensar que 180 MB es mucho para un simple "Hola Mundo", pero considerando que no se requiere nada para poder ejecutar solo Docker, nos olvidamos de ... "en mi maquina funciona".