web-dev-qa-db-fra.com

Docker + Node.js + Windows

Ce que je veux: ancrer une application web Node.js (je suis sous Windows)

Conteneur Windows

docker-compose up m'obtient cette erreur:

Service 'webapp' failed to build: no matching manifest for windows/AMD64 in the manifest list entries

Autant que je sache, c'est parce qu'il n'y a pas d'image Node.js pour Windows, et une solution serait de passer au conteneur Linux.

Pas assez de mémoire

Lorsque j'essaie de passer à un conteneur Linux, Docker me dit que je n'ai pas assez de mémoire. La modification de la quantité de mémoire allouée via les paramètres ne le résout pas.

Modifier: fichiers

docker-compose

version: '3'

services:
  webapp:
    build: ./Front
    volumes:
      - ./Front:./dockerized
    ports:
     - 5001:8080

Dockerfile:

FROM node:Alpine

RUN mkdir -p ../dockerized

WORKDIR ../dockerized

COPY package*.json ../dockerized

RUN npm install

COPY . ../dockerized

EXPOSE 8080
CMD [ "npm", "start" ]
7
Emilien

Je sais que la question d'origine est assez ancienne mais comme j'ai eu un problème similaire ces derniers jours et que je n'ai pas trouvé de bonne solution au même endroit, j'ai décidé de partager mon expérience pour résoudre ce problème.

Supposons donc que vous souhaitiez exécuter le conteneur Docker basé sur Windows sur Windows et utiliser Node.JS à l'intérieur.

Voici les options que vous avez:

  1. Basculez vers le conteneur Docker basé sur Linux qui peut également être exécuté sous Windows. La première ligne du fichier docker pourrait ressembler à celle-ci:

    FROM node:latest

Supposons simplement que le passage à un conteneur basé sur Linux ne soit pas une option pour vous. Il peut y avoir plusieurs raisons à cela (par exemple, dans mon cas, j'ai essayé de déployer mon Angular dans un conteneur Docker basé sur Linux vers un cluster Azure Service Fabric local sur Windows 10, mais il prend en charge Windows- images basées uniquement).

Dans ce cas, vous devez passer au conteneur Windows et il existe deux autres options.

  1. Utilisez n'importe quelle image Docker Windows personnalisée avec Node.JS déjà installé (l'option proposée par Kush Grover)

  2. Créez votre propre image Docker basée sur Windows et installez Node.JS à l'intérieur. Cette dernière option est ce que j'ai finalement proposé car je ne voulais pas me fier à une image personnalisée publique non officielle.

Voici un exemple de fichier Docker basé sur Windows avec l'installation de Node.JS:

FROM mcr.Microsoft.com/windows/servercore:1803 as installer

Shell ["powershell", "-Command", "$ErrorActionPreference = 'Stop';$ProgressPreference='silentlyContinue';"]

RUN Invoke-WebRequest -OutFile nodejs.Zip -UseBasicParsing "https://nodejs.org/dist/v12.4.0/node-v12.4.0-win-x64.Zip"; `
Expand-Archive nodejs.Zip -DestinationPath C:\; `
Rename-Item "C:\\node-v12.4.0-win-x64" c:\nodejs

FROM mcr.Microsoft.com/windows/nanoserver:1803

WORKDIR C:\nodejs
COPY --from=installer C:\nodejs\ .
RUN SETX PATH C:\nodejs
RUN npm config set registry https://registry.npmjs.org/

WORKDIR /app

# install and cache app dependencies
COPY src/WebSpa/package.json /app/src/WebSpa/package.json

WORKDIR /app/src/WebSpa
RUN npm install
RUN npm install -g @angular/cli@latest

# add app
COPY . /app

# start app
CMD cd /app/src/WebSpa && ng serve --Host 0.0.0.0

Une brève explication de ce fichier. J'utilise une image officielle basée sur Windows (FROM ...servercore:1803...) puis téléchargez les fichiers binaires Node.JS (RUN Invoke-WebRequest...) et ajoutez des éléments requis au registre (RUN npm config set registry...). Plus tard, j'utilise les commandes Node.JS NPM pour installer les packages requis pour mon Angular app (RUN npm install) et installez Angular CLI (RUN npm install -g @angular/cli@latest) pour pouvoir exécuter Angular sur le conteneur (...ng serve...).

Notez que je télécharge Node.JS de la version 12.4.0 (dernière version stable disponible pour le moment) et que vous souhaiterez peut-être utiliser une version différente.

J'espère que c'était assez clair et que quelqu'un trouvera cela utile.

11
Witcher

J'ai le même problème lors de la création de mon Dockerfile sur Windows 10 avec le nœud: 8. J'ai changé pour une image de nœud personnalisée ici: https://hub.docker.com/r/stefanscherer/node-windows/

Ou bien Si vous préférez utiliser celui officiel, essayez de passer aux conteneurs Linux.

2
Kush Grover

J'ai pu déployer et exécuter cela avec succès en modifiant le Dockerfile comme suit ...

FROM mcr.Microsoft.com/windows/servercore:1803 as installer

Shell ["powershell", "-Command", "$ErrorActionPreference = 'Stop';$ProgressPreference='silentlyContinue';"]

RUN Invoke-WebRequest -OutFile nodejs.Zip -UseBasicParsing "https://nodejs.org/dist/v12.4.0/node-v12.4.0-win-x64.Zip"; Expand-Archive nodejs.Zip -DestinationPath C:\; Rename-Item "C:\\node-v12.4.0-win-x64" c:\nodejs

FROM mcr.Microsoft.com/windows/nanoserver:1803

WORKDIR C:/nodejs
COPY --from=installer C:/nodejs/ .
RUN SETX PATH C:\nodejs
RUN npm config set registry https://registry.npmjs.org/
1
Troy