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

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

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

Докерфайл

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 \
  && curl -fSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \
  && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \
  && ln -snf /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \
  && ln -snf /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \
  && rm yarn-v$YARN_VERSION.tar.gz \
  && 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 (оболочка для разработчиков)

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 build --no-cache

docker-compose up

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

Спасибо!

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
294
2

Ответы 2

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

volumes:
  - /website/node_modules/

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

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

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

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

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

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

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

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

Другие вопросы по теме