我们正尝试使用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 不起作用。
答案 0 :(得分:1)
因为某些节点模块需要编译,所以在运行npm i
时,npm会与OS兼容,即Windows中的node_module
文件夹与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