Docker + Node.js + Windows

Emi*_*ien 2 windows node.js docker linux-containers

我想要的是: dockerize一个Node.js Web应用程序(我在Windows上)

Windows容器

docker-compose up 让我这个错误:

Service 'webapp' failed to build: no matching manifest for windows/amd64 in the manifest list entries
Run Code Online (Sandbox Code Playgroud)

据我了解,这是因为Windows没有Node.js映像,而解决方法是切换到Linux容器。

内存不足

当我尝试切换到linux容器时,Docker告诉我我没有足够的内存。通过设置更改分配的内存量不会解决该问题。

编辑:文件

docker-compose

version: '3'

services:
  webapp:
    build: ./Front
    volumes:
      - ./Front:./dockerized
    ports:
     - 5001:8080
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM node:alpine

RUN mkdir -p ../dockerized

WORKDIR ../dockerized

COPY package*.json ../dockerized

RUN npm install

COPY . ../dockerized

EXPOSE 8080
CMD [ "npm", "start" ]
Run Code Online (Sandbox Code Playgroud)

Wit*_*her 7

我知道原来的问题已经很老了,但是由于我最近几天遇到过类似的问题,并且无法在一个地方找到好的解决方案,所以我决定分享我在解决这个问题上的经验。

因此,假设您要在Windows上运行基于Windows的Docker容器并在其中使用Node.JS。

您可以使用以下选项:

  1. 切换到基于Linux的Docker容器,该容器也可以在Windows中运行。docker文件的第一行可能如下所示:

    FROM node:latest

让我们假设迁移到基于Linux的容器不是您的选择。可能有多种原因(例如,在我的情况下,我尝试将基于Linux的Docker容器中的Angular应用程序部署到Windows 10上的本地Azure Service Fabric群集,但仅支持基于Windows的映像)。

在这种情况下,您必须转到基于Windows的容器,并且还有两个选择。

  1. 使用已安装Node.JS的任何基于Windows的自定义Docker映像(Kush Grover建议的选项)

  2. 创建您自己的基于Windows的Docker映像并在其中安装Node.JS。最后一个选择是我最终想到的,因为我不想依赖某些非官方的公共定制形象。

这是带有Node.JS安装的基于Windows的Docker文件的示例:

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
Run Code Online (Sandbox Code Playgroud)

此文件的简短说明。我使用基于Windows的官方映像(FROM ...servercore:1803...),然后下载Node.JS二进制文件(RUN Invoke-WebRequest...),并将一些必需的内容添加到注册表(RUN npm config set registry...)。稍后,我使用Node.JS NPM命令为Angular应用程序(RUN npm install)安装所需的软件包,并安装Angular CLI(RUN npm install -g @angular/cli@latest),以便能够在容器上运行Angular(...ng serve...)。

请注意,我下载了版本12.4.0的Node.JS(目前有最新稳定版本),您可能要使用其他版本。

我希望这已经足够清楚,并且有人会发现它很有用。

  • 我收到错误:系统找不到指定的注册表路径。关于 RUN SETX PATH C:\nodejs 有什么想法吗? (4认同)

小智 5

我能够通过如下更改 Dockerfile 来成功部署和运行它...

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/
Run Code Online (Sandbox Code Playgroud)