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

ammar26

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

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

我们的项目结构如下。

项目结构

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

我们的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不起作用。

仍然贾汉吉里

因为某些节点模块需要编译,所以在运行npm inpm时,请获取与OS兼容的模块,即node_moduleWindows中文件夹与Mac不同。

最佳解决方案:将docker_compose中的node_module与绑定安装隔离。所以编辑docker-compose.yml

volumes:
   - ./source:/node_dir/source

至:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章