Docker + Node.js + Windows

Docker + Node.js + Windows

我想要的: dockerize 一个 Node.js 网络应用程序(我在 Windows)

Windows 容器

docker-compose up 给我这个错误:

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

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

内存不足

当我尝试切换到 linux 容器时,Docker 告诉我内存不足。通过设置更改分配的内存量并不能解决它。

编辑:文件

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

使用 node:8 在 Windows 10 上构建我的 Dockerfile 时遇到同样的问题。 我在这里更改为自定义节点图像:https://hub.docker.com/r/stefanscherer/node-windows/

否则,如果您更喜欢使用官方容器,请尝试切换到 Linux 容器。

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

所以,假设您想要 运行 Windows-based Docker 容器 Windows 并在里面使用 Node.JS。

您有以下选择:

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

    FROM node:latest

让我们假设迁移到 Linux-based 容器不是您的选择。这可能有几个原因(例如,在我的例子中,我尝试将 Linux-based Docker 容器中的 Angular 应用程序部署到 Windows 10 上的本地 Azure Service Fabric 集群但它仅支持 Windows-based 个图像)。

在这种情况下,您必须移动到 Windows-based 容器,并且还有两个选项。

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

  2. 创建您自己的 Windows-based Docker 映像并在其中安装 Node.JS。最后一个选项是我最终想到的,因为我不想依赖一些 non-official public 自定义图像。

这里是 Windows-based Docker 文件的示例 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

对该文件的简短说明。 我使用 Windows-based 官方镜像 (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...).

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

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

我能够成功部署 运行 通过如下更改 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/