#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, а также создайте и разверните образ, как только он начнет работать, но не раньше.