node.js - .NET Core Docker Image para aplicaciones SPA
asp.net-core asp.net-core-mvc (4)
¿Cuál es la imagen de Docker correcta para usar al crear una nueva aplicación ASP.NET Core MVC, específicamente con la plantilla React / Redux (u otra Node.js requerida)? Si no es una imagen específica, ¿qué comandos o proceso deben seguirse en el Dockerfile para una aplicación Node.js respaldada por ASP.NET Core MVC?
No necesito la versión SDK del marco para otra cosa que no sea ejecutar el sitio MVC de respaldo.
dotnet new reactredux
La imagen en tiempo de ejecución no tiene Node.js instalado y se producirá un error al intentar ejecutar el contenedor.
Dockerfile:
FROM microsoft/aspnetcore:latest
ARG source=./bin/Debug/netcoreapp2.0/publish/
WORKDIR /app
COPY $source .
EXPOSE 80
ENTRYPOINT ["dotnet", "Project.dll"]
Error:
Unhandled Exception: System.AggregateException: One or more errors occurred. (Failed to start Node process. To resolve this:.
[1] Ensure that Node.js is installed and can be found in one of the PATH directories.
Current PATH enviroment variable is: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
Make sure the Node executable is in one of those directories, or update your PATH.
El proyecto con el que estoy trabajando se está actualizando de ASP.NET MVC para .NET Standard 1.1 (independiente), a un nuevo proyecto .NET Standard 2.0 React / Redux.
Basado en la respuesta anterior de @Daniels, ejecutando Visual Studio 2017 v15.4 y ASP.NET Core 2.0 en Docker, aquí están los cambios que debe hacer para permitir un comportamiento correcto de producción y desarrollo para aplicaciones de SPA (en mi caso, estoy usando Angular ):
Agregue un nuevo Dockerfile a su proyecto, que es una copia del original. Vamos a llamarlo Dockerfile.Development. Modificar de la siguiente manera:
FROM microsoft/aspnetcore:2.0 ARG source # BEGIN MODIFICATION - Node is needed for development (but not production) RUN curl -sL https://deb.nodesource.com/setup_6.x | bash - RUN apt-get install --assume-yes nodejs # END MODIFICATION WORKDIR /app EXPOSE 80 COPY ${source:-obj/Docker/publish} . ENTRYPOINT ["dotnet", "MyService.dll"]
Modifique el archivo docker-compose.override.yml en su solución para usar este nuevo archivo docker en desarrollo. Se verá algo como esto:
version: ''3'' services: myservice: environment: - ASPNETCORE_ENVIRONMENT=Development ports: - "80" build: dockerfile: Dockerfile.Development
Modifique el archivo webpack.config.js en su proyecto para habilitar la observación de cambios, de la siguiente manera:
const clientBundleConfig = merge(sharedConfig, { entry: { ''main-client'': ''./ClientApp/boot.browser.ts'' }, output: { path: path.join(__dirname, clientBundleOutputDir) }, // BEGIN MODIFICATION watch: isDevBuild, watchOptions: { poll: isDevBuild ? 1000 : false }, // END MODIFICATION plugins: [ new webpack.DllReferencePlugin({ context: __dirname, manifest: require(''./wwwroot/dist/vendor-manifest.json'') }) ].concat(isDevBuild ? [
Conseguí que la plantilla de ejemplo Angular funcionara simplemente instalando nodejs en la base:
FROM microsoft/aspnetcore:2.0 AS base
RUN apt-get update && /
apt-get install -y wget && /
apt-get install -y gnupg2 && /
wget -qO- https://deb.nodesource.com/setup_6.x | bash - && /
apt-get install -y build-essential nodejs
WORKDIR /app
EXPOSE 80
... rest of Dockerfile ...
Todo lo demás (Webpack Hot swap) no arrojó un error.
El problema es que la imagen base en su archivo docker (microsoft / aspnetcore: más reciente) no tiene un nodo instalado.
Así que tienes que instalar el nodo para poder ejecutar el proyecto. Este es el archivo docker que se me ocurrió:
FROM microsoft/aspnetcore:2.0
ARG source
EXPOSE 80 5102
ENV ASPNETCORE_URLS http://*:80
RUN apt-get -qq update && apt-get -qqy --no-install-recommends install wget gnupg /
git /
unzip
RUN curl -sL https://deb.nodesource.com/setup_6.x | bash -
RUN apt-get install -y nodejs
WORKDIR /app
COPY ${source:-obj/Docker/publish} .
ENTRYPOINT ["dotnet", "Project.dll"]
Observe cómo en la línea 5 del archivo docker estoy ejecutando un comando para actualizar apt-get. Y luego en la línea 8-9 se instala el nodo en la imagen de la ventana acoplable.
Todavía hay un problema, el reemplazo de módulos en caliente de webpack no funciona. Ni siquiera una actualización completa funciona. Todavía lo estoy viendo.
ACTUALIZACIÓN: así que examiné el problema de reemplazo del módulo en caliente, y parece ser una limitación de la ventana acoplable para Windows .
La solución es configurar el paquete web para que pueda indicar al navegador que realice una encuesta para los cambios en un período de tiempo determinado. Vea este enlace para ver cómo configurarlo.
ACTUALIZACIÓN: Investigando un poco más, descubrí que Microsoft tiene una imagen que puede usar para construir su proyecto, se llama: microsoft / aspnetcore-build. Esta imagen tiene todas las dependencias que necesita para la construcción (incluidos los nodejs).
Así que al final, lo que hice fue dejar mi Dockerfile como estaba (con microsoft / aspnetcore: 2.0 como imagen base) y crear un nuevo Dockerfile para el desarrollo que hace referencia a la imagen de compilación que mencioné anteriormente. Con la ayuda de Docker Compose, cambio Dockerfiles en función del entorno.
Este enfoque parece más conveniente porque cuando las imágenes se implementan en el entorno de producción, deben tener listo todo su código javascript (en el caso de una aplicación de spa con angular 2, reaccionar, etc.), en otras palabras, no deben tener una dependencia de nodejs, por lo que Ellos menos pesados en tamaño.
Si necesita agregar solo el node
binario a su imagen, puede copiar lo que hace el microsoft/aspnetcore-build
:
ENV NODE_VERSION 6.10.3
RUN set -ex /
&& for key in /
9554F04D7259F04124DE6B476D5A82AC7E37093B /
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 /
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 /
FD3A5288F042B6850C66B31F09FE44734EB7990E /
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 /
DD8F2338BAE7501E3DD5AC78C273792F7D83545D /
B9AE9905FFD7803F25714661B63B535A4C206CA9 /
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 /
; do /
gpg --keyserver pgp.mit.edu --recv-keys "$key" || /
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key" || /
gpg --keyserver keyserver.pgp.com --recv-keys "$key" ; /
done
# set up node
RUN buildDeps=''xz-utils'' /
&& set -x /
&& apt-get update && apt-get install -y $buildDeps --no-install-recommends /
&& rm -rf /var/lib/apt/lists/* /
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" /
&& curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" /
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc /
&& grep " node-v$NODE_VERSION-linux-x64.tar.xz/$" SHASUMS256.txt | sha256sum -c - /
&& tar -xJf "node-v$NODE_VERSION-linux-x64.tar.xz" -C /usr/local --strip-components=1 /
&& rm "node-v$NODE_VERSION-linux-x64.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt /
&& apt-get purge -y --auto-remove $buildDeps /
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs
Esto agrega aproximadamente ~ 42 MB a su imagen frente a ~ 157 MB usando apt-get
.