Docker x NodeJS - проблема с node_modules - PullRequest
0 голосов
/ 04 марта 2019

Я веб-разработчик, который в настоящее время работает над проектом next.js (это просто фреймворк для SSR ReactJS).Я использую конфигурацию Docker в этом проекте и обнаружил проблему при добавлении / удалении зависимостей.Когда я добавляю зависимость, собираю свой проект и добавляю его с помощью docker-compose, моя новая зависимость не добавляется в образ 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 \
  && 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 (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-compose

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

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

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

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

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

volumes:
  - .:/website
  - /website/node_modules/
0 голосов
/ 04 марта 2019

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

volumes:
  - /website/node_modules/

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

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

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

...