Мы пытаемся создать контейнер с запущенным node.js, используя docker (docker-compose, так как мы собираемся добавить и mongodb впоследствии).
Мы копируем package.json в Dockerfile, а затем монтируем том в docker-compose.yml , который содержит исходный код для выполнения.
Структура нашего проекта следующая.
Мы хотим, чтобы исходная папка была смонтирована как том.
Наш package.json file
{
"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 file
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 не будет работать.