用于SPA应用程序的.NET核心Docker镜像

当创build一个新的ASP.NET Core MVC应用程序,特别是使用React / Redux(或其他需要Node.js)模板时,什么是正确的Docker镜像? 如果不是特定的图像,那么在Dockerfile中为ASP.NET Core MVC支持的Node.js应用应该遵循哪些命令或进程?

除了运行后备MVC站点之外,我不需要SDK的框架版本。

dotnet new reactredux

运行时映像没有安装Node.js,并且在尝试运行容器时会出错。

Dockerfile:

 FROM microsoft/aspnetcore:latest ARG source=./bin/Debug/netcoreapp2.0/publish/ WORKDIR /app COPY $source . EXPOSE 80 ENTRYPOINT ["dotnet", "Project.dll"] 

错误:

 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. 

我正在使用的项目正在从ASP.NET标准1.1(独立版)的ASP.NET MVC升级到新的.NET标准2.0 React / Redux项目。

问题是dockerfile(microsoft / aspnetcore:latest)中的基本映像没有安装节点。

所以你必须安装节点,以便你可以运行该项目。 这是我提出的dockerfile:

 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"] 

请注意dockerfile的第5行,我正在运行一个命令来更新apt-get。 然后在第8-9行中将节点安装到docker映像中

还有一个问题,从webpack热模块更换不起作用。 甚至没有完整的刷新工作。 我仍然在看它。

更新:所以我研究了热模块更换问题,它似乎是一个窗口的docker的限制 。

解决方法是configurationwebpack,以便告诉浏览器在确定的时间内轮询更改。 看到这个链接,看看如何configuration它

更新:做更多的研究我发现,微软有一个图像,你可以用来build立你的项目,它被称为:microsoft / aspnetcore-build。 该图像具有构build所需的所有依赖关系(包括nodejs)。

所以最后,我所做的就是将我的Dockerfile保持原样(以microsoft / aspnetcore:2.0作为基础映像),并为开发引入了一个新的Dockerfile,它引用了我之前提到的构build映像。 在docker撰写的帮助下,我根据环境切换Dockerfiles。

这种方法似乎更方便,因为当图像部署到生产环境时,他们应该已经准备好了所有的javascript代码(对于angular度为2的spa应用程序,反应等),换句话说,它们不应该具有nodejs依赖性他们不那么重。

如果你只需要添加node二进制文件到你的图像,你可以复制一下microsoft/aspnetcore-build dockerfile的function:

 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 

这增加了大约42 MB到你的形象比〜157 MB使用apt-get

基于上面的@Daniels回答,在Docker上运行Visual Studio 2017 v15.4和ASP.NET Core 2.0,下面是为了让SPA应用程序正确生产和开发行为而需要做出的改变(在我的例子中,我使用的是Angular ):

  • 添加一个新的Dockerfile到您的项目是原始的副本。 我们称之为Dockerfile.Development。 修改如下:

     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"] 
  • 修改解决scheme中的docker-compose.override.yml文件以在开发中使用此新的dockerfile。 它看起来像这样:

     version: '3' services: myservice: environment: - ASPNETCORE_ENVIRONMENT=Development ports: - "80" build: dockerfile: Dockerfile.Development 
  • 修改项目中的webpack.config.js文件以启用监视更改,如下所示:

     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 ? [