Не удается найти ошибку модуля из docker-composer (только в Windows) - PullRequest
0 голосов
/ 22 мая 2019

Мы пытаемся создать контейнер с запущенным node.js, используя docker (docker-compose, так как мы собираемся добавить и mongodb впоследствии).

Мы копируем package.json в Dockerfile, а затем монтируем том в docker-compose.yml , который содержит исходный код для выполнения.

Структура нашего проекта следующая.

Project structure

Мы хотим, чтобы исходная папка была смонтирована как том.

Наш 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 не будет работать.

1 Ответ

1 голос
/ 24 мая 2019

потому что некоторый модуль узла должен быть скомпилирован, поэтому при запуске npm i npm получите совместимый модуль с ОС, т. Е. Папка node_module в Windows отличается от Mac.

лучшее решение: изолировать модуль_узла от монтирования bind вдокер-Compose.так что отредактируйте docker-compose.yml от:

volumes:
   - ./source:/node_dir/source

до:

volumes:
   - /node_dir/node_modules # isolate node_modules for compatible os
   - ./source:/node_dir/source
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...