javascript - 无法从 docker-composer 找到模块错误(仅在 Windows 上)

标签 javascript node.js docker docker-compose dockerfile

我们正在尝试使用 docker 创建一个运行 node.js 的容器(docker-compose,因为我们也打算在之后添加 mongodb)。

我们正在复制 Dockerfile 中的 package.json,然后在 docker-compose.yml 中安装一个卷,其中包含要执行的源代码。

我们的项目结构如下。

Project structure

我们希望将源文件夹作为卷安装。

我们的package.json文件

{
  "name": "node_package",
  "version": "1.0.0",
  "description": "node_package inside node_dir for node_service running on node_container",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "start": "node source/index.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.0"
  }
}

我们的Dockerfile

FROM node:10-alpine
WORKDIR /node_dir
COPY package*.json ./
RUN npm install

我们的docker-compose.yml

version: "3"
services:

  node_service:

     build: .

     container_name: node_container

     user: node

     working_dir: "/node_dir"

     ports:
     - "8080:3000"

     volumes:
     - ./source:/node_dir/source

     command: npm start

现在,当我们在 macOS 上运行它时,它就可以工作了。它将源文件夹安装为卷,然后执行命令 npm start。但是当我们在 Windows 上尝试相同的操作时,我们会收到以下错误

找不到模块“node_dir/source/index.js”

为什么它在 mac 上运行但在 windows 上不起作用?

这是我们的index.js文件

const express = require('express')
const app = express()
const port = 3000

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => {console.log(`Example app listening on port ${port}!`)})

当我们复制 Dockerfile 中的源文件夹时,它可以在 Windows 上运行。但是,如果我们不复制 Dockerfile 中的源文件夹并将其挂载为 docker-compose.yml 中的卷,则 命令 npm start 将不起作用。

最佳答案

因为某些 Node 模块需要编译,所以当运行npm i时,npm会得到与操作系统兼容的模块,即Windows中的node_module文件夹与Mac不同。

最佳解决方案:将node_module与docker-compose中的绑定(bind)挂载隔离。 所以编辑docker-compose.yml 来自:

volumes:
   - ./source:/node_dir/source

至:

volumes:
   - /node_dir/node_modules # isolate node_modules for compatible os
   - ./source:/node_dir/source

关于javascript - 无法从 docker-composer 找到模块错误(仅在 Windows 上),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56255827/

相关文章:

ruby-on-rails - 无法从浏览器查看在Docker容器中运行的Rails应用

javascript - 使用 Javascript 删除带有通配符的字符串中的值

javascript - 如何使 CKeditor 所见即所得编辑器的拼写检查器工作

javascript - 单击按钮时拼接不移除

javascript - 创建多个位于彼此之上的可放置 sibling

javascript - 无法在 Node/ react 简单输入示例中设置 this.state 变量

javascript - 该对象是否被垃圾回收?

javascript - Node.js 堆溢出错误

android - 在 Docker 中为 Android 运行并行的 Gitlab CI 作业

docker 错误: unknown blob