2014-11-05 4 views
8

Я использую Docker, поэтому этот случай может показаться странным. Но я хочу, чтобы весь мой каталог /data был установлен внутри моего контейнера докеров при разработке.npm package.json и докер (установка его ...)

My /data папку контейнер мой package.json файл, app каталог и куча других вещей. Проблема в том, что я хочу, чтобы моя папка node_modules НЕ была постоянной, только файл package.json.

Я попробовал пару вещей, но package.json и npm дает мне трудное время здесь ...

  • Установка файла package.json непосредственно сломается НПМ. npm пытается переименовать файл при сохранении, что невозможно, если его смонтированный файл.
  • Установка родительской папки (/data) будет монтировать папку node_modules.
  • Я не могу найти какой-либо параметр конфигурации, чтобы поместить node_modules в другую папку вне /data, пример /dist
  • Ввод package.json в /data/conf установки /data/conf как тома вместо не будут работать. Я не могу найти способ указать путь package.json в npmrc.
  • Помещение package.json в /data/conf и ссылка на него /data/package.json не работает. npm разрывает символическую ссылку и заменяет ее файлом.

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

+0

Это тяжелый инструмент, но наложение наложения unionfs не решит ваши проблемы? – Wrikken

+0

Поскольку файл отображается как точка монтирования внутри контейнера, это не имеет значения. Он не может переименовать (заменить) файл, так как он будет отключен от точки монтирования после замены. – xeor

+0

Я сделал это с помощью глобального пути установки: http://www.saulshanabrook.com/npm-docker-sharing -volumes/ –

ответ

7

Как вы уже ответили, я думаю, что это может быть единственным решением прямо сейчас.

Когда вы строите свой Docker образ, сделать что-то вроде:

COPY data/package.json /data/ 
RUN mkdir /dist/node_modules && ln -s /dist/node_modules /data/node_modules && cd /data && npm install 

А для других вещей (например, беседку, сделать то же самое)

COPY data/.bowerrc /data/ 
COPY data/bower.json /data/ 
RUN mkdir /dist/vendor && ln -s /dist/vendor /data/vendor && cd /data && bower install --allow-root 

И COPY data/ /data в конце (так вы можете использовать кеширование докеров и не выполнять установку npm/docker при изменении на data.

Вам также необходимо создать символические ссылки, которые вам нужны, и сохранить их в своем git-repo. Они будут недействительными снаружи, но будут работать на внутренней стороне вашего контейнера.

Используя это решение, вы можете смонтировать ваш $PWD/data:/data, не получая «мусор» npm/bower вне вашего контейнера. И вы все равно сможете создать свое изображение как автономное развертывание своих сервисов.

0

Может быть, вы можете сохранить свой контейнер , а затем восстановить его на регулярной основе с минимальным dockerfile

ИЗ my_container

и файл, содержащий .dockerignore

/данные/node_modules

См ДоП http://docs.docker.com/reference/builder/#the-dockerignore-file

+1

На лицевой стороне разработки, когда есть много изменений и с помощью fig, чтобы развернуть env, это не очень хорошее решение. Единственная проблема - этот файл package.json, ни один из остальных. Это решение также усложнит все это. – xeor

1

Решение, которое я пошел с размещал папку node_modules в /dist/node_modules, и сделать символическую ссылку на него из /data/node_modules. Я могу сделать это и в моем файле Docker, чтобы он использовал его при создании, и я могу отправить свои символические ссылки на мой git-repo. Все хорошо сработало.

4

Аналогичным и альтернативным способом является использование переменной NODE_ENV вместо создания символической ссылки.

RUN mkdir -p /dist/node_modules RUN cp -r node_modules/* /dist/node_modules/ ENV NODE_PATH /dist/node_modules

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

+0

Это не сработает, если нам нужно запустить команду 'grunt'. – lvarayut

3

Я с этой проблемой в течение некоторого времени, и принятое решение не работает для меня *

Я нашел это link, который имел редактировать указывая here и это действительно работает для меня:

volumes: 
    - ./:/data 
    - /data/node_modules 

в этом случае система создает объем (см Compose reference на volumes), который не установлен в каталог с исходными кодами. Это было самым простым решением и не требует от меня сделать какие-либо символические ссылки, установка путей и т.д.

Для справки, мой простой Dockerfile выглядит так:

# install node requirements 
WORKDIR /data 
COPY ./package.json ./package.json 
RUN npm install -qq 

# add source code 
COPY ./ ./ 

# run watch script 
CMD npm run watch 

(watch сценарий просто webpack --watch -d)

Надеюсь, это поможет кому-то помочь и сэкономить часы, как это было для меня!


«*» = я не мог заставить webpack работать из моих package.json скриптов и установить что-нибудь, а внутри контейнера создал node_modules папку с тем, что я только что установили (я бегу npm i --save [packages] внутри контейнера, чтобы получить обновление пакета package.json до следующей перестройки)

Смежные вопросы