wake-up-neo.com

.NET Core Docker Image für SPA-Anwendungen

Welches Docker-Image ist das richtige, wenn Sie eine neue ASP.NET Core MVC-App erstellen, insbesondere mit der Vorlage React/Redux (oder einer anderen erforderlichen Node.js)? Wenn kein bestimmtes Image, welche Befehle oder Prozesse sollten in der Docker-Datei für eine Node.js-Anwendung, die von ASP.NET Core MVC unterstützt wird, befolgt werden?

Ich benötige die SDK-Version des Frameworks nur zum Ausführen der MVC-Backing-Site.

dotnet new reactredux

Im Laufzeitabbild ist Node.js nicht installiert. Beim Ausführen des Containers wird ein Fehler angezeigt.

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.

Das Projekt, mit dem ich arbeite, wird von ASP.NET MVC für .NET Standard 1.1 (Standalone) auf ein neues .NET Standard 2.0 React/Redux-Projekt aktualisiert.

17
falquan

Das Problem ist, dass das Basis-Image in Ihrer Docker-Datei (Microsoft/aspnetcore: latest) keinen Knoten installiert hat.

Sie müssen also einen Knoten installieren, damit Sie das Projekt ausführen können. Dies ist die Docker-Datei, die ich mir ausgedacht habe:

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

Beachten Sie, wie ich in Zeile 5 der Docker-Datei einen Befehl zur Aktualisierung von apt-get ausführen kann. Dann wird in Zeile 8-9 der Knoten im Docker-Image installiert

Es gibt immer noch ein Problem, der Hot-Module-Austausch aus dem Webpack funktioniert nicht. Nicht einmal eine vollständige Aktualisierung funktioniert. Ich schaue immer noch hinein.

UPDATE: Also habe ich mir das Hot-Modul-Austauschproblem angesehen und es scheint eine Einschränkung des Dockers für Windows zu sein.

Die Problemumgehung besteht darin, das Webpack so zu konfigurieren, dass es den Browser anweist, Änderungen zu einem bestimmten Zeitraum abzufragen. Siehe diesen Link, um zu sehen, wie man es konfiguriert

UPDATE: Nach etwas Recherche habe ich herausgefunden, dass Microsoft ein Image hat, mit dem Sie Ihr Projekt erstellen können. Es heißt: Microsoft/aspnetcore-build. Dieses Image enthält alle Abhängigkeiten, die Sie zum Erstellen (einschließlich Nodejs) benötigen.

Am Ende habe ich also meine Dockerfile so belassen, wie sie war (mit Microsoft/aspnetcore: 2.0 als Basis-Image), und eine neue Dockerfile für die Entwicklung erstellt, die auf das bereits erwähnte Build-Image verweist. Mit Hilfe von docker compose wechsle ich Dockerfiles je nach Umgebung.

Dieser Ansatz scheint zweckmäßiger zu sein, da bei der Bereitstellung von Images in der Produktionsumgebung der gesamte Javascript-Code bereit sein muss (im Fall einer Spa-Anwendung mit Winkel 2 reagieren Sie usw.), mit anderen Worten, sie sollten keine Knotenabhängigkeit haben sie sind weniger schwer.

14
Daniel

Basierend auf der obigen Antwort von @Daniels, die Visual Studio 2017 v15.4 und ASP.NET Core 2.0 unter Docker ausführt, müssen Sie die folgenden Änderungen vornehmen, um ein korrektes Produktions- und Entwicklungsverhalten für SPA-Anwendungen zu ermöglichen (in meinem Fall verwende ich Angular ):

  • Fügen Sie Ihrem Projekt eine neue Docker-Datei hinzu, bei der es sich um eine Kopie des Originals handelt. Nennen wir es Dockerfile.Development. Ändern Sie wie folgt:

    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"]
    
  • Ändern Sie die Datei docker-compose.override.yml in Ihrer Lösung, um diese neue Docker-Datei in der Entwicklung zu verwenden. Es wird ungefähr so ​​aussehen:

    version: '3'
    
    services:
      myservice:
        environment:
          - ASPNETCORE_ENVIRONMENT=Development
        ports:
          - "80"
        build:
          dockerfile: Dockerfile.Development
    
  • Ändern Sie die Datei webpack.config.js in Ihrem Projekt so, dass Änderungen auf folgende Weise aktiviert werden können:

    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 ? [
    
2
Cliff Hudson

Wenn Sie nur die node-Binärdatei zu Ihrem Bild hinzufügen müssen, können Sie die Funktionen der Microsoft/aspnetcore-build-Docker-Datei kopieren:

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

Dies fügt Ihrem Bild ca. ~ 42 MB gegenüber ~ 157 MB hinzu, indem Sie apt-get verwenden.

1
codersl

Ich bekam die Angular-Beispielvorlage, um zu funktionieren, indem ich nodejs in der Basis installiere:

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 ...

Alles andere (Webpack Hot Swap) hat keinen Fehler ausgelöst.

1
J. Polfer