Docker x NodeJS — проблема с node_modules

#node.js #docker #docker-compose #node-modules

#node.js #docker #docker-создать #узлы-модули

Вопрос:

Я веб-разработчик, который в настоящее время работает над next.js проект (это просто фреймворк для SSR ReactJS). Я использую Docker config в этом проекте и обнаружил проблему при добавлении / удалении зависимостей. Когда я добавляю зависимость, создаю свой проект и обновляю его с помощью docker-compose, моя новая зависимость не добавляется в мой образ Docker. Я должен очистить свою систему docker с помощью docker system prune , чтобы сбросить все, после чего я мог бы создать свой проект. После этого моя зависимость добавляется в мой контейнер Docker.

Я использую Dockerfile для настройки своего изображения и разных docker-compose файлов различные конфигурации в зависимости от моих сред. Вот моя конфигурация:

Dockerfile

 FROM node:10.13.0-alpine

# SET environment variables
ENV NODE_VERSION 10.13.0
ENV YARN_VERSION 1.12.3

# Install Yarn
RUN apk add --no-cache --virtual .build-deps-yarn curl 
  amp;amp; curl -fSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" 
  amp;amp; tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ 
  amp;amp; ln -snf /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn 
  amp;amp; ln -snf /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg 
  amp;amp; rm yarn-v$YARN_VERSION.tar.gz 
  amp;amp; apk del .build-deps-yarn

# Create app directory
RUN mkdir /website
WORKDIR /website
ADD package*.json /website

# Install app dependencies 
RUN yarn install

# Build source files
COPY . /website/
RUN yarn run build
  

docker-compose.yml (dev env)

 version: "3"
services:
  app:
    container_name: website
    build:
      context: .
    ports:
      - "3000:3000"
      - "3332:3332"
      - "9229:9229"
    volumes:
      - /website/node_modules/
      - .:/website
    command: yarn run dev 0.0.0.0 3000
    environment:
      SERVER_URL: https://XXXXXXX.com
  

Вот мои команды для запуска моей среды Docker:

сборка docker-compose -no-cache

docker-создание

Я полагаю, что что-то не так в конфигурации моего Docker, но я не могу это уловить. У вас есть идея, как мне помочь?

Спасибо!

Ответ №1:

Ваши тома прямо сейчас не настроены для выполнения того, что вы собираетесь делать. Текущий набор ниже означает, что вы переопределяете содержимое вашего website каталога в контейнере вашим локальным . каталогом.

 volumes:
  - /website/node_modules/
  - .:/website
  

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

Изменение порядка ваших томов, как показано ниже, должно решить проблему.

 volumes:
  - .:/website
  - /website/node_modules/
  

Ответ №2:

Вы явно сообщаете Docker, что хотите такого поведения. Когда вы говорите:

 volumes:
  - /website/node_modules/
  

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

Это означает, что если вы измените свой package.json и перестроите образ, Docker продолжит использовать объемную версию вашего node_modules каталога. (Аналогично, привязка монтирования .:/website означает, что все остальное в последней половине вашего Dockerfile по существу игнорируется.)

Я бы удалил volumes: блок в этой настройке, чтобы учесть программу, которая создается в образе. (Я бы также предложил переместить command: в CMD строку в Dockerfile .) Разработайте и протестируйте свое приложение без использования Docker, а также создайте и разверните образ, как только он начнет работать, но не раньше.