Почему docker создает пустые node_modules и как этого избежать? - PullRequest
0 голосов
/ 19 января 2019

Есть несколько похожих вопросов , но они не ответили, почему docker создает пустой каталог node_modules в репозитории, даже если файл docker настроен для хранения node_modules в контейнере?

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

## Dockerfile

FROM node:8.11.4-alpine
RUN apk update && apk add yarn
RUN yarn global add nodemon
WORKDIR /usr/app

COPY package.json yarn.lock /usr/app/
RUN yarn

EXPOSE 3000

## docker-compose.yml

version: "3.2"

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    command: nodemon index.js
    volumes:
      - .:/usr/app
      - /usr/app/node_modules
    ports:
      - "3000:3000"

Ответы [ 2 ]

0 голосов
/ 20 января 2019

Вы правы, ваш процесс построения образа устанавливает пакеты узлов в каталог node_modules в образе.Итак, после создания образа образ содержит node_modules, и вы можете использовать его для запуска приложения.

Вы видите node_modules на своем хост-компьютере из-за настроек томов в файле Compose.Однако есть нечто большее, чем вы видите в другом ответе.

То, что происходит, заключается в том, что вы отображаете .:/usr/app в своем первом определении тома, что означает, что вы отображаете текущий каталог на хосте в /usr/app в контейнере.

Это заменит каталог /usr/app в образе текущим каталогом на хосте.И у вашего хоста нет каталога node_modules (если только вы не установили на нем также node_modules), и, следовательно, ваш контейнер не будет работать с этим отображением, потому что вы переопределили /usr/app и нет директивы node_modules впереопределение. Узел выдаст ошибку, что он не может найти модули узла.

Следующее сопоставление тома решает ситуацию, на самом деле это обычная настройка разработки узла.Вы создаете том /usr/app/node_modules.Обратите внимание, что у этого тома нет хост-части, в отображении нет :, здесь только один каталог.Это означает, что Docker смонтирует каталог /usr/app/node_modules из образа и добавит его в предыдущее сопоставление, где вы установили каталог хоста в /usr/app.

Таким образом, в работающем контейнере вы получите исходный код из текущего каталога хоста PLUS node_modules из базового образа благодаря двойному отображению.

В качестве побочного эффекта вы увидите пустой каталог node_modules в текущем каталоге вашего хоста.

0 голосов
/ 19 января 2019

Не специалист по докеру, но я думаю, что проблема произошла из-за блока volumes в вашем файле

docker-compose.yml.Удалите строку

 - /usr/app/node_modules

и повторите попытку

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...