Не удается найти ошибку модуля от docker-composer (только в Windows)

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

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

Структура нашего проекта выглядит следующим образом.

Project structure

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

Наш файл пакет.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"
  }
}

Наш Докерфайл

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

Наш докер-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, это работает. Он монтирует исходную папку как том, а затем выполняет команда запуска нпм. Но когда мы пытаемся сделать то же самое в 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, то команда запуска нпм не работает.

Вы пытались удалить папку node_modules и снова запустить «npm install» на компьютере с Windows?

rrd 22.05.2019 14:27

Вы имеете в виду, что я должен запустить «npm install» на хост-машине с Windows или на образе контейнера?

ammar26 22.05.2019 14:41

Ну, вы говорите: «мы попробуем то же самое на окнах», поэтому я предполагаю, что у вас есть оболочка bash, работающая на окнах (или что-то в этом роде), и вы используете какой-то svn (git и т. д.), чтобы получить репо, поэтому по умолчанию вы все равно придется запускать npm install, верно? Я просто предлагаю удалить папку node_modules и запустить ее снова.

rrd 22.05.2019 14:44

Нет, мы не используем репо. Это просто простой проект установки. Мы просто скопировали файлы вручную. Мы копируем package.json и запускаем непосредственно npm install на образ докера.

ammar26 22.05.2019 15:08

Мы также попытались удалить папку с модулями и снова запустить ее. Это ничего не изменило, потому что выдавало ошибку в файле index.js, смонтированном как том на докере (работающем в Windows)

ammar26 22.05.2019 15:09
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Сравнение структур данных: Массивы и объекты в Javascript
Сравнение структур данных: Массивы и объекты в Javascript
Итак, вы изучили основы JavaScript и хотите перейти к изучению структур данных. Мотивация для изучения/понимания Структур данных может быть разной,...
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Создание собственной системы электронной коммерции на базе Keystone.js - настройка среды и базовые модели
Прошлая статья была первой из цикла статей о создании системы электронной коммерции с использованием Keystone.js, и она была посвящена главным образом...
Приложение для отслеживания бюджета на React js для начинающих
Приложение для отслеживания бюджета на React js для начинающих
Обучение на практике - это проверенная тема для достижения успеха в любой области. Если вы знаете контекст фразы "Практика делает человека...
Стоит ли использовать React в 2022 году?
Стоит ли использовать React в 2022 году?
В 2022 году мы все слышим о трендах фронтенда (React, Vue), но мы не знаем, почему мы должны использовать эти фреймворки, когда их использовать, а...
1
5
1 158
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

volumes:
   - ./source:/node_dir/source

к:

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

Разве node_modules уже не изолированы в нашем текущем сценарии? потому что docker-compose.yml монтирует исходную папку с хоста в контейнер внутри каталога node_dir. Но node_modules находится в каталоге node_dir (сгенерированном установкой npm в контейнере с использованием Dockerfile, на один уровень выше, чем смонтированная исходная папка). Я не понимаю, как объявление «/node_dir/node_modules» в томе изолирует его для совместимой ОС?

ammar26 26.05.2019 01:36

нет, когда вы привязываете каталог node_dir к контейнеру докеров, файловая система - это та же ОС хоста, а не файловая система linux. при изоляции node_modules с помощью описанной выше техники node_modules перемещаются во временный том, эта файловая система основана на файловой системе Linux и полностью совместима.

Masih Jahangiri 26.05.2019 13:16

Ну все равно не работает. Ошибка такая же даже после изоляции файла /node_dir/node_modules.

ammar26 27.05.2019 11:05

о, теперь сосредоточьтесь на коде, который знает, что index.js не монтируется (или копируется) в контейнер, поэтому вы должны скопировать index.js в контейнер /node_dir, чтобы решить проблему.

Masih Jahangiri 27.05.2019 18:32

Я хочу, чтобы index.js находился в исходной папке. Я также проверил, даже если я не монтирую / не связываю / не присоединяю какой-либо том и копирую всю исходную папку с помощью команды COPY в файле докера после установки NPM ... Это все равно дает мне ошибку. Если я помещаю файл index.js в папку node_dir (тот же каталог, что и package.json и node_modules), он работает, но если я перемещаю его в исходную папку, он не работает. Неважно, использую ли я исходную папку или папку node_modules в качестве тома или нет. Это просто не работает, когда я помещаю index.js в исходную папку, даже если я указал это в своем package.json.

ammar26 28.05.2019 08:04

вы должны добавить эту строку в конец Dockerfile: «COPY index.js ./»

Masih Jahangiri 28.05.2019 13:18

Да, я сделал, и это не имело никакого значения. Добавление index.js не поможет, так как мой index.js находится внутри исходной папки. И я пытался скопировать все, но это не работает, когда я ссылаюсь на исходную папку.

ammar26 28.05.2019 14:05

Я могу помочь вам в мессенджере телеграмм. мое имя пользователя: масихджахангири

Masih Jahangiri 28.05.2019 17:12

Другие вопросы по теме