У меня проблема с установкой node_modules внутри контейнера Docker и синхронизацией их с хостом. Моя версия Docker 18.03.1-ce, build 9ee9f40 и версия Docker Compose 1.21.2, build a133471.
Мой docker-compose.yml выглядит так:
# Frontend Container.
frontend:
build: ./app/frontend
volumes:
- ./app/frontend:/usr/src/app
- frontend-node-modules:/usr/src/app/node_modules
ports:
- 3000:3000
environment:
NODE_ENV: ${ENV}
command: npm start
# Define all the external volumes.
volumes:
frontend-node-modules: ~
Мой Dockerfile:
# Set the base image.
FROM node:10
# Create and define the working directory.
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
# Install the application dependencies.
COPY package.json ./
COPY package-lock.json ./
RUN npm install
Уловка с внешним объемом описана во многих постах блога и ответах Stack Overflow. Например, этот.
Приложение прекрасно работает. Исходный код синхронизирован. Горячая перезагрузка тоже отлично работает.
Единственная проблема, которая у меня есть, это то, что папка node_modules пуста на хосте. Можно ли синхронизировать папку node_modules которая находится внутри контейнера Docker, с хостом?
Я уже прочитал эти ответы:
К сожалению, они мне не очень помогли. Мне не нравится первый, потому что я не хочу запускать npm install на моем хосте из-за возможных межплатформенных проблем (например, хост - Windows или Mac, а контейнер Docker - Debian 8 или Ubuntu 16.04). Второй Dockerfile тоже мне не подходит, потому что я хотел бы запустить npm install в моем Dockerfile вместо того, чтобы запускать его после запуска контейнера Docker.
Кроме того, я нашел этот пост в блоге. Автор пытается решить ту же проблему, с которой я столкнулся. Проблема в том, что node_modules не будут синхронизированы, потому что мы просто копируем их из контейнера Docker на хост.
Я хотел бы, чтобы мои node_modules внутри контейнера Docker были синхронизированы с хостом. Пожалуйста, примите во внимание, что я хочу:
- установить
node_modulesавтоматически, а не вручную - установить
node_modulesвнутри контейнера Docker вместо хоста - синхронизировать
node_modulesс хостом (если я устанавливаю новый пакет внутри контейнера Docker, он должен синхронизироваться с хостом автоматически без каких-либо действий вручную)
Мне нужно иметь node_modules на хосте, потому что:
- возможность читать исходный код, когда мне нужно
- интегрированная среда должна
node_modulesбыть установлен локально, чтобы он мог иметь доступ кdevDependencies, таких какeslintилиprettier. Я не хочу устанавливать этиdevDependenciesглобально.
Заранее спасибо.