Escribí recientemente en un blog sobre la optimización de los tamaños de los archivos .NET y ASP.NET Docker. .NET Core 2.0 se creó anteriormente en una imagen de Debian, pero hoy en día hay una imagen de vista previa con .NET Core 2.1 nightlies usando Alpine. Puede leer sobre el anuncio aquí sobre esta nueva imagen de vista previa de Alpine. También hay una buena publicación acumulada en .NET y Docker.
Han añadido dos nuevas imágenes:
2.1-runtime-alpine
2.1-runtime-deps-alpine
El soporte de Alpine es parte de la versión .NET Core 2.1. Las imágenes de .NET Core 2.1 se proporcionan actualmente en el repositorio microsoft/dotnet-nightly, incluidas las nuevas imágenes de Alpine. Las imágenes de .NET Core 2.1 se promocionarán al repositorio de microsoft/dotnet cuando se publiquen en 2018.
NOTA:La imagen -runtime-deps- contiene las dependencias necesarias para una aplicación .NET Core, pero NO el tiempo de ejecución de .NET Core en sí. Esta es la imagen que usaría si su aplicación fuera una aplicación independiente que incluyera una copia del tiempo de ejecución de .NET Core. Se trata de aplicaciones publicadas con -r [runtimeid]. La mayoría de la gente usará la imagen -runtime- que incluía el tiempo de ejecución completo de .NET Core. Para ser claro:
- El
runtime
la imagen contiene el tiempo de ejecución de .NET Core y está diseñada para ejecutar aplicaciones implementadas dependientes del marco; consulte la muestra- El
runtime-deps
la imagen contiene solo las dependencias nativas que necesita .NET Core y está diseñada para ejecutar aplicaciones implementadas autónomas; consulte la muestra
Es mejor con .NET Core usar archivos de compilación de varias etapas, de modo que tenga un contenedor que compila su aplicación y otro que contiene los resultados de esa compilación. De esa manera, no terminará enviando una imagen con un montón de SDK y compiladores que no necesita.
NOTA:Lea esto para obtener más información sobre las versiones de imágenes en Dockerfiles para que pueda elegir la etiqueta y el resumen adecuados para sus necesidades. Idealmente, elegirá un archivo docker que avance para incluir los parches de mantenimiento más recientes.
Dado este archivo docker, construimos con la imagen SDK, luego publicamos y el resultado es de aproximadamente 219 megas.
FROM microsoft/dotnet:2.0-sdk as builder
RUN mkdir -p /root/src/app/dockertest
WORKDIR /root/src/app/dockertest
COPY dockertest.csproj .
RUN dotnet restore ./dockertest.csproj
COPY . .
RUN dotnet publish -c release -o published
FROM microsoft/dotnet:2.0.0-runtime
WORKDIR /root/
COPY --from=builder /root/src/app/dockertest/published .
ENV ASPNETCORE_URLS=http://+:5000
EXPOSE 5000/tcp
CMD ["dotnet", "./dockertest.dll"]
Luego guardaré esto como Dockerfile.debian y compilaré así:
> docker build . -t shanselman/dockertestdeb:0.1 -f dockerfile.debian
Con una aplicación ASP.NET estándar, esta imagen termina siendo 219 megas.
Ahora solo cambiaré una línea y usaré el tiempo de ejecución alpino 2.1
FROM microsoft/dotnet-nightly:2.1-runtime-alpine
Y construye así:
> docker build . -t shanselman/dockertestalp:0.1 -f dockerfile.alpine
y comparar los dos:
> docker images | find /i "dockertest"
shanselman/dockertestalp 0.1 3f2595a6833d 16 minutes ago 82.8MB
shanselman/dockertestdeb 0.1 0d62455c4944 30 minutes ago 219MB
Agradable. Aproximadamente 83 megas ahora en lugar de 219 megas para una aplicación web Hello World. Ahora la idea de un micro ¡el servicio es más factible!
Diríjase al problema de GitHub aquí https://github.com/dotnet/dotnet-docker-nightly/issues/500 y ofrezca sus opiniones y resultados mientras prueba estas imágenes de Alpine. Además, ¿está interesado en un "-debian-slim?" Sería medio camino de Alpine pero no tan pesado como solo -debian.
Un montón de cosas geniales suceden alrededor de .NET y Docker. Asegúrese de consultar también la publicación de Jeff Fritz sobre la creación de un contenedor de Windows ASP.NET Core mínimo para ver cómo puede aplastar las aplicaciones .(full) Framework que se ejecutan también en contenedores de Windows. Por ejemplo, las imágenes de Windows Nano Server tienen solo 93 megas comprimidos .
Patrocinador: Obtenga la vista previa más reciente de JetBrains Rider para la compatibilidad con .NET Core 2.0, Value Tracking y Call Tracking, MSTest runner, nuevas inspecciones y refactorizaciones de código y la vista Parallel Stacks en el depurador.