Локальный модуль nodejs не найден докером - PullRequest
0 голосов
/ 19 ноября 2018

У меня есть модуль nodejs под названием my-common, который содержит пару файлов js.Эти js-файлы экспортируют функции, которые используются во многих других модулях.

Мой другой модуль (называемый demo) содержит зависимость от общего модуля следующим образом:

"dependencies": {
    "my-common": "file:../my-common/",
}

Когда я иду в демонстрационный каталог и запускаю npm start, он работает нормально.Затем я создаю образ Docker, используя следующий Dockerfile:

FROM node:8 ENV NODE_ENV=production WORKDIR /usr/src/app COPY package*.json ./ RUN npm install --only=production COPY . . EXPOSE 3000 CMD [ "npm", "start" ]

Когда я запускаю образ, я получаю ошибку, что my-common не может быть найден.Я предполагаю, что модуль my-common не копируется в каталог node_modules демонстрационного модуля.

Я попробовал ссылку npm, однако я думаю, что действительно очень плохая идея - требовать разрешения sudo дляустановите глобальный модуль, потому что это может вызвать проблемы в других системах.

Я пробовал npm install my-common/ в корневом каталоге, и это устанавливает модуль в мои модули HOME_DIR / node_modules, однако он не устанавливается ни в контейнер докера.

Куда бы я ни посмотрел, нигде не видно ответа на этот очень простой вопрос.Как я могу это исправить?

1 Ответ

0 голосов
/ 19 ноября 2018

Итак, я вижу пару разных вещей.

Когда Docker запускает npm install --only=production в образе, Docker видит file:../my-common/ и смотрит на родительский каталог WORKDIR образа Docker, который равен /usr/src/app.Так как ничего кроме package.json не было скопировано в образ в тот момент, он не может найти модуль.Если вы хотите установить все локально, а затем переместить его в образ, вы можете сделать это, удалив команду npm install --only=production из Dockerfile и убедившись, что файл .dockerignore не игнорирует каталог node_modules.

Если вы хотите установить модули в образ, вам нужно специально скопировать каталог my-common в образ докера.Однако Docker не позволяет вам копировать что-либо из родительского каталога в изображение.Любой локальный контент должен быть в контексте Dockerfile.У вас есть пара опций:

Опция 1: Переместить my-common/ в корень вашего проекта, обновите ваш Dockerfile, чтобы скопировать эту папку, и обновите файл package.json, чтобы он указывал на правильное местоположение.

Dockerfile:

FROM node:8
ENV NODE_ENV=production
WORKDIR /usr/src/app
COPY my-common/ ./
COPY package*.json ./
RUN npm install --only=production
COPY . .
EXPOSE 3000
CMD [ "npm", "start" ]

package.json:

"dependencies": {
    "my-common": "file:./my-common/",
}

Опция 2 : переместить контекст образа Docker вверх на один каталог,Под этим я подразумеваю перемещение файла Docker на тот же уровень, что и каталог my-common, и обновите ваш Dockerfile и package.json, чтобы отразить это изменение.

Dockerfile:

FROM node:8
ENV NODE_ENV=production
WORKDIR /usr/src/app
RUN mkdir my-common
COPY ./my-common ./my-common
COPY ./<projectName>/package*.json .
RUN npm install --only=production
COPY ./<projectName> .
EXPOSE 3000
CMD [ "npm", "start" ]

package.json:

"dependencies": {
    "my-common": "file:./my-common/",
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...