visual - asp.net mvc angular 5
dotnet core+Angular Universal+docker=> Falló el procesamiento previo debido a un error: Error: no se puede encontrar el módulo (1)
angular2-universal-polyfills
ya no existe. Esto ocurre probablemente cuando ejecuta localmente su paquete de instalación desde su caché local, pero cuando lo ejecuta en un contenedor, busca en el registro de npm y falla. Para actualizar su proyecto, puede seguir la documentación de este link en el github. Tienen una buena explicación de cómo migrar.
Tenemos un proyecto desarrollado usando Dotnet core, Angular Universal. Usamos la función prerender de los servicios de Asp.net Core SPA. En el entorno local, la aplicación funciona tanto en Windows como en Linux. Hay algunos problemas al usar la propia plantilla de compilación de varias etapas de Visual Studio. Después de crearlo en microsoft / aspnetcore-build image, transferimos los archivos a microsoft / aspnetcore image. Debido a la dependencia de Asp.net SPA a nodejs, también instalamos nodejs a microsoft / aspnetcore image.
Pero cuando ejecutamos la aplicación, obtenemos el error "Error en el procesamiento previo debido a un error: Error: No se puede encontrar el módulo ''angular2-universal-polyfills''" en la etapa de prerender de main.bundle.js (servidor). Estamos seguros de que el problema no está relacionado con ''polyfills angular2-universal'' porque también hemos probado otros polyfills y obtuvimos errores similares.
Pero cuando instalamos tanto .net core como nodejs en un solo contenedor en lugar de compilación de múltiples etapas y construimos y publicamos operaciones dentro del mismo contenedor, nuestra aplicación funciona. Pero entonces el contenedor es de 2 GB de tamaño.
Teóricamente, no hay diferencia entre el contenedor que construimos y el contenedor que ejecutamos. Ambos tienen tanto .net core como nodejs instalados. La única diferencia es que copiamos la salida de publicación al contenedor que ejecutamos.
Publicar salida
root
wwwroot (angular client-side dist)
assets
inline.bundle.js
main.bundle.js
polyfill.bundle.js
vendor.bundle.js
CodefictionApp/dist-server (angular server-side dist)
assets
main.bundle.js
dlls
Dockerfile de trabajo
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM buildpack-deps:jessie-scm
RUN apt-get update /
&& apt-get install -y --no-install-recommends /
libc6 /
libcurl3 /
libgcc1 /
libgssapi-krb5-2 /
libicu52 /
liblttng-ust0 /
libssl1.0.0 /
libstdc++6 /
libunwind8 /
libuuid1 /
zlib1g /
&& rm -rf /var/lib/apt/lists/*
ENV DOTNET_SDK_VERSION 2.1.200
ENV DOTNET_SDK_DOWNLOAD_URL https://dotnetcli.blob.core.windows.net/dotnet/Sdk/$DOTNET_SDK_VERSION/dotnet-sdk-$DOTNET_SDK_VERSION-linux-x64.tar.gz
ENV DOTNET_SDK_DOWNLOAD_SHA c1b07ce8849619ca505aafd2983bcdd7141536ccae243d4249b0c9665daf107e03a696ad5f1d95560142cd841a0888bbf5f1a8ff77d3bdc3696b5873481f0998
RUN curl -SL $DOTNET_SDK_DOWNLOAD_URL --output dotnet.tar.gz /
&& echo "$DOTNET_SDK_DOWNLOAD_SHA dotnet.tar.gz" | sha512sum -c - /
&& mkdir -p /usr/share/dotnet /
&& tar -zxf dotnet.tar.gz -C /usr/share/dotnet /
&& rm dotnet.tar.gz /
&& ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
ENV DOTNET_RUNNING_IN_CONTAINER=true /
DOTNET_USE_POLLING_FILE_WATCHER=true /
NUGET_XMLDOC_MODE=skip
RUN mkdir warmup /
&& cd warmup /
&& dotnet new /
&& cd .. /
&& rm -rf warmup /
&& rm -rf /tmp/NuGetScratch
ENV RestoreUseSkipNonexistentTargets false
ENV NODE_VERSION="8.11.0"
RUN apt-get install wget -y
RUN set -ex /
&& for key in /
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 /
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 /
FD3A5288F042B6850C66B31F09FE44734EB7990E /
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 /
DD8F2338BAE7501E3DD5AC78C273792F7D83545D /
B9AE9905FFD7803F25714661B63B535A4C206CA9 /
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 /
77984A986EBC2AA786BC0F66B01FBB92821C587A /
56730D5401028683275BD23C23EFEFE93C4CFFFE /
; do /
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; /
done
RUN set -ex /
&& wget "https://nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" -O node-v$NODE_VERSION-linux-x64.tar.gz /
&& wget "https://nodejs.org/download/release/v$NODE_VERSION/SHASUMS256.txt.asc" -O SHASUMS256.txt.asc /
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc /
&& grep " node-v$NODE_VERSION-linux-x64.tar.gz/$" SHASUMS256.txt | sha256sum -c - /
&& tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 /
&& rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc SHASUMS256.txt /
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs /
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN npm config set user 0
RUN npm config set unsafe-perm true
RUN npm install -g @angular/[email protected]
RUN node -v && npm -v && ng -v
RUN apt-get update && apt-get install bzip2 -y
ENV ASPNETCORE_URLS http://+:80
WORKDIR /app
EXPOSE 80
COPY . .
RUN dotnet restore ./CodefictionApi
RUN dotnet publish ./CodefictionApi -c Release
WORKDIR /app/CodefictionApi/bin/Release/netcoreapp2.0/publish
ENTRYPOINT ["dotnet", "CodefictionApi.dll"]
Archivo de ventana acoplable de varias etapas (que da error de prerender cuando se ejecuta)
FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80
FROM buildpack-deps:jessie-scm AS publisher
RUN apt-get update /
&& apt-get install -y --no-install-recommends /
libc6 /
libcurl3 /
libgcc1 /
libgssapi-krb5-2 /
libicu52 /
liblttng-ust0 /
libssl1.0.0 /
libstdc++6 /
libunwind8 /
libuuid1 /
zlib1g /
&& rm -rf /var/lib/apt/lists/*
ENV DOTNET_SDK_VERSION 2.1.200
ENV DOTNET_SDK_DOWNLOAD_URL https://dotnetcli.blob.core.windows.net/dotnet/Sdk/$DOTNET_SDK_VERSION/dotnet-sdk-$DOTNET_SDK_VERSION-linux-x64.tar.gz
ENV DOTNET_SDK_DOWNLOAD_SHA c1b07ce8849619ca505aafd2983bcdd7141536ccae243d4249b0c9665daf107e03a696ad5f1d95560142cd841a0888bbf5f1a8ff77d3bdc3696b5873481f0998
RUN curl -SL $DOTNET_SDK_DOWNLOAD_URL --output dotnet.tar.gz /
&& echo "$DOTNET_SDK_DOWNLOAD_SHA dotnet.tar.gz" | sha512sum -c - /
&& mkdir -p /usr/share/dotnet /
&& tar -zxf dotnet.tar.gz -C /usr/share/dotnet /
&& rm dotnet.tar.gz /
&& ln -s /usr/share/dotnet/dotnet /usr/bin/dotnet
ENV DOTNET_RUNNING_IN_CONTAINER=true /
DOTNET_USE_POLLING_FILE_WATCHER=true /
NUGET_XMLDOC_MODE=skip
RUN mkdir warmup /
&& cd warmup /
&& dotnet new /
&& cd .. /
&& rm -rf warmup /
&& rm -rf /tmp/NuGetScratch
ENV RestoreUseSkipNonexistentTargets false
ENV NODE_VERSION="8.11.0"
RUN apt-get install wget -y
RUN set -ex /
&& for key in /
94AE36675C464D64BAFA68DD7434390BDBE9B9C5 /
0034A06D9D9B0064CE8ADF6BF1747F4AD2306D93 /
FD3A5288F042B6850C66B31F09FE44734EB7990E /
71DCFD284A79C3B38668286BC97EC7A07EDE3FC1 /
DD8F2338BAE7501E3DD5AC78C273792F7D83545D /
B9AE9905FFD7803F25714661B63B535A4C206CA9 /
C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 /
77984A986EBC2AA786BC0F66B01FBB92821C587A /
56730D5401028683275BD23C23EFEFE93C4CFFFE /
; do /
gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; /
done
RUN set -ex /
&& wget "https://nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.gz" -O node-v$NODE_VERSION-linux-x64.tar.gz /
&& wget "https://nodejs.org/download/release/v$NODE_VERSION/SHASUMS256.txt.asc" -O SHASUMS256.txt.asc /
&& gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc /
&& grep " node-v$NODE_VERSION-linux-x64.tar.gz/$" SHASUMS256.txt | sha256sum -c - /
&& tar -xzf "node-v$NODE_VERSION-linux-x64.tar.gz" -C /usr/local --strip-components=1 /
&& rm "node-v$NODE_VERSION-linux-x64.tar.gz" SHASUMS256.txt.asc SHASUMS256.txt /
&& ln -s /usr/local/bin/node /usr/local/bin/nodejs /
&& rm -fr /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN npm config set user 0
RUN npm config set unsafe-perm true
RUN npm install -g @angular/[email protected]
RUN node -v && npm -v && ng -v
RUN apt-get update && apt-get install bzip2 -y
ENV ASPNETCORE_URLS http://+:80
WORKDIR /app
COPY . .
RUN dotnet restore ./CodefictionApi
RUN dotnet publish ./CodefictionApi -c Release
FROM base AS final
ARG source
EXPOSE 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_8.x | bash -
RUN apt-get install -y nodejs
RUN npm config set user 0
RUN npm config set unsafe-perm true
RUN npm install -g npm
RUN npm install -g @angular/[email protected] --unsafe
RUN npm install -g @angular/[email protected]
RUN node -v && npm -v && ng -v
ENV ASPNETCORE_ENVIRONMENT=Development
WORKDIR /app/CodefictionApi/bin/Release/netcoreapp2.0/publish
COPY --from=publisher /app/CodefictionApi/bin/Release/netcoreapp2.0/publish .
ENTRYPOINT ["dotnet", "CodefictionApi.dll"]
paquete.json
{
"name": "codefiction-app",
"version": "0.0.0",
"license": "MIT",
"scripts": {
"ng": "ng",
"start": "ng serve",
"build": "ng build --prod",
"test": "ng test",
"lint": "ng lint",
"e2e": "ng e2e"
},
"private": true,
"dependencies": {
"@angular/cli": "~1.7.4",
"@angular/animations": "^5.0.0",
"@angular/common": "^5.0.0",
"@angular/compiler": "^5.0.0",
"@angular/core": "^5.0.0",
"@angular/forms": "^5.0.0",
"@angular/http": "^5.0.0",
"@angular/platform-browser": "^5.0.0",
"@angular/platform-browser-dynamic": "^5.0.0",
"@angular/platform-server": "^5.0.0",
"@angular/router": "^5.2.1",
"@nguniversal/aspnetcore-engine": "^5.0.0",
"@nguniversal/common": "^5.0.0",
"@types/node": "^7.0.12",
"angular2-router-loader": "^0.3.5",
"angular2-template-loader": "^0.6.2",
"angular2-universal-polyfills": "2.0.11",
"aspnet-prerendering": "3.0.1",
"awesome-typescript-loader": "^3.0.0",
"bootstrap": "^3.3.7",
"bootstrap-sass": "^3.3.7",
"core-js": "^2.5.1",
"css": "^2.2.1",
"css-loader": "^0.28.7",
"event-source-polyfill": "^0.0.9",
"file-loader": "^0.11.2",
"html-loader": "^0.5.1",
"isomorphic-fetch": "^2.2.1",
"jquery": "^2.2.1",
"json-loader": "^0.5.4",
"moment": "2.18.1",
"node-sass": "^4.5.2",
"preboot": "6.0.0-beta.0",
"raw-loader": "^0.5.1",
"rimraf": "^2.6.2",
"rxjs": "^5.5.6",
"style-loader": "^0.18.2",
"to-string-loader": "^1.1.5",
"typescript": "~2.5.0",
"url-loader": "^0.5.7",
"zone.js": "^0.8.4"
},
"devDependencies": {
"@angular/compiler-cli": "^5.2.1",
"@types/chai": "^3.4.34",
"@types/jasmine": "^2.5.37",
"chalk": "^2.4.1",
"chai": "^3.5.0",
"codelyzer": "4.0.0",
"jasmine-core": "^2.5.2",
"karma": "^1.7.1",
"karma-chai": "^0.1.0",
"karma-chrome-launcher": "^2.2.0",
"karma-coverage": "^1.1.1",
"karma-jasmine": "^1.1.0",
"karma-mocha-reporter": "^2.2.4",
"karma-phantomjs-launcher": "^1.0.4",
"karma-remap-coverage": "^0.1.4",
"karma-sourcemap-loader": "^0.3.7",
"protractor": "~5.1.2",
"ts-node": "~4.1.0",
"tslint": "~5.9.1"
}
}
comando csproj publish
<Target Name="PublishProject" BeforeTargets="ComputeFilesToPublish">
<Exec Command="npm install" />
<Exec Command="./node_modules/.bin/ng -v" />
<Exec Command="./node_modules/.bin/ng build --env=dev --app 0" />
<Exec Command="./node_modules/.bin/ng build --env=dev --app 1" />
<!-- Include the newly-built files in the publish output -->
<ItemGroup>
<DistFiles Include="wwwroot/**; CodefictionApp/dist-server/**" />
<ResolvedFileToPublish Include="@(DistFiles->''%(FullPath)'')" Exclude="@(ResolvedFileToPublish)">
<RelativePath>%(DistFiles.Identity)</RelativePath>
<CopyToPublishDirectory>PreserveNewest</CopyToPublishDirectory>
</ResolvedFileToPublish>
</ItemGroup>
</Target>
La fuente completa puede ser inspeccionada desde aquí.
https://github.com/Blind-Striker/codefiction-tech-new
La versión que no funciona puede ser inspeccionada desde esta rama
https://github.com/Blind-Striker/codefiction-tech-new/tree/docker-not-working-version
Gracias.