Итак, я вижу пару разных вещей.
Когда 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/",
}