Сначала я хотел бы поблагодарить David Maze и trust512 за размещение их ответов. К сожалению, они не помогли мне решить мою проблему.
Я хотел бы опубликовать свой ответ на этот вопрос.
Мой docker-compose.yml
:
---
# Define Docker Compose version.
version: "3"
# Define all the containers.
services:
# Frontend Container.
frontend:
build: ./app/frontend
volumes:
- ./app/frontend:/usr/src/app
ports:
- 3000:3000
environment:
NODE_ENV: development
command: /usr/src/app/entrypoint.sh
Мой Dockerfile
:
# Set the base image.
FROM node:10
# Create and define the node_modules's cache directory.
RUN mkdir /usr/src/cache
WORKDIR /usr/src/cache
# Install the application's dependencies into the node_modules's cache directory.
COPY package.json ./
COPY package-lock.json ./
RUN npm install
# Create and define the application's working directory.
RUN mkdir /usr/src/app
WORKDIR /usr/src/app
И последнее, но не менее важное. entrypoint.sh
:
#!/bin/bash
cp -r /usr/src/cache/node_modules/. /usr/src/app/node_modules/
exec npm start
Самая сложная часть здесь - установить node_modules
в каталог кэша node_module
(/usr/src/cache
), который определен в нашем Dockerfile
. После этого entrypoint.sh
переместит node_modules
из каталога кэша (/usr/src/cache
) в каталог нашего приложения (/usr/src/app
). Благодаря этому на нашем хост-компьютере появится весь каталог node_modules
.
Глядя на мой вопрос выше, я хотел:
- для установки
node_modules
автоматически вместо ручного
- для установки
node_modules
внутри контейнера Docker вместо хоста
- для синхронизации
node_modules
с хостом (если я устанавливаю какой-то новый пакет внутри контейнера Docker, он должен быть
синхронизируется с хостом автоматически без каких-либо ручных действий
Первое, что сделано: node_modules
устанавливаются автоматически. Второе тоже сделано: node_modules
установлены внутри контейнера Docker (так что кроссплатформенных проблем не будет). И третье тоже сделано: node_modules
, которые были установлены внутри контейнера Docker, будут видимыми на нашей хост-машине, и они будут синхронизированы ! Если мы установим новый пакет внутри контейнера Docker, он будет сразу синхронизирован с нашим хост-компьютером.
Важное замечание: по правде говоря, новый пакет, установленный внутри контейнера Docker, появится в /usr/src/app/node_modules
. Поскольку этот каталог синхронизирован с нашим хостом, этот новый пакет появится и в каталоге node_modules
нашего хоста. Но /usr/src/cache/node_modules
будет иметь старую сборку на этом этапе (без этого нового пакета). Во всяком случае, это не проблема для нас. В течение следующего docker-compose up --build
(требуется --build
) Docker переустановит node_modules
(так как package.json
был изменен), а файл entrypoint.sh
переместит их в наш /usr/src/app/node_modules
.
Вы должны принять во внимание еще одну важную вещь. Если вы git pull
код из удаленного репозитория или git checkout your-teammate-branch
, когда Docker работает, возможно, в файл package.json
будут добавлены некоторые новые пакеты. В этом случае вы должны остановить Docker с помощью CTRL + C
и снова запустить его с помощью docker-compose up --build
(требуется --build
). Если ваши контейнеры работают как демон, вам нужно просто выполнить docker-compose stop
, чтобы остановить контейнеры и снова запустить его с помощью docker-compose up --build
(требуется --build
).
Если у вас есть какие-либо вопросы, пожалуйста, дайте мне знать в комментариях.
Надеюсь, это поможет.