.NET Core Docker Image для приложений SPA

Какое правильное изображение Docker используется при создании нового приложения ASP.NET Core MVC, в частности, с помощью шаблона React/Redux (или другого Node.js)? Если не конкретное изображение, какие команды или процесс должны выполняться в файле Docker для приложения Node.js, поддерживаемого ASP.NET Core MVC?

Я не требую SDK-версии фреймворка для чего-либо другого, кроме запуска резервного MVC-сайта.

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 MVC для .NET Standard 1.1 (автономный) до нового проекта .NET Standard 2.0 React/Redux.

Ответ 1

Проблема заключается в том, что базовое изображение в вашем файле dockerfile (microsoft/aspnetcore: latest) не содержит node.

Итак, вам нужно установить node, чтобы вы могли запускать проект. Это докер файл, с которым я пришел:

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

Обратите внимание, как в строке 5 файла docker я запускаю команду для обновления apt-get. И затем в строке 8-9 node устанавливается на изображение докеры

По-прежнему существует проблема, замена горячего модуля из webpack не работает. Даже полное обновление не работает. Я все еще смотрю на него.

UPDATE: поэтому я рассмотрел проблему замены горячего модуля и, по-видимому, это ограничение докера для окон.

Обходной путь заключается в настройке webpack, чтобы он мог сообщать обозревателю об изменениях в течение определенного времени. Посмотрите эту ссылку, чтобы узнать, как ее настроить

UPDATE: Сделав немного больше исследований, я узнал, что у microsoft есть образ, который вы можете использовать для создания своего проекта, он называется: microsoft/aspnetcore-build. Это изображение имеет все зависимости, необходимые для построения (включая nodejs).

Итак, в конце концов, я оставил свой файл Docker как есть (с microsoft/aspnetcore: 2.0 в качестве базового образа) и создал новый файл Docker для разработки, который ссылается на образ сборки, о котором я упоминал ранее. С помощью docker compose я переключаю Dockerfiles в зависимости от среды.

Этот подход кажется более удобным, потому что, когда образы развертываются в производственной среде, они должны иметь все готовые javascript-коды (в случае спа-приложения с angular 2, реагировать и т.д.), другими словами, они не должны иметь зависимость nodejs, делая их менее тяжелыми по размеру.

Ответ 2

Основываясь на ответе @Daniels выше, используя Visual Studio 2017 v15.4 и ASP.NET Core 2.0 на Docker, вот изменения, которые необходимо внести, чтобы обеспечить правильное поведение Production and Development для приложений SPA (в моем случае я " m с помощью Angular):

  • Добавить новый файл Docker в ваш проект, который является копией оригинала. Давайте назовем его 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"]
    
  • Измените файл docker-compose.override.yml в своем решении, чтобы использовать этот новый файл докеров в разработке. Это будет выглядеть примерно так:

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

Ответ 3

Если вам нужно добавить только двоичный код node к вашему изображению, вы можете скопировать то, что делает файл dockerfile 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

Это добавляет около 42 МБ к вашему изображению против ~ 157 МБ с помощью apt-get.