2016-03-30 3 views
1

Я создаю приложение на python с файлами javascript. Я хочу использовать browserify, поэтому я хочу установить некоторые модули узлов, которые я могу использовать в своих js-файлах с вызовами require. Я хочу, чтобы эти модули узлов были только в моем контейнере, а не в хост-машине. Вот моя настройка Docker для конкретного контейнера.Файлы контейнера докеров, перезаписанные общим томом хоста

### Dockerfile 
FROM node:5.9.1 
RUN npm install -g browserify 
RUN mkdir /js_scripts 
ADD package.json /js_scripts/                           
WORKDIR /js_scripts 
RUN npm install # This installs required packages from package.json 
RUN ls # lists the node_modules directory indicating successful install. 

Теперь я хочу поделиться js files от моего хозяина машины с этим контейнером, так что я могу запустить browserify main.js -o bundle.js команды в контейнере. Вот мой docker-compose.yml, который копирует host_js_files в мой каталог js_scripts.

node: 
    build: .                                
    volumes: 
    - ./host_js_files:/js_scripts 

Теперь, когда я бегу контейнер docker-compose run node bash и ls в каталоге js_scripts Я вижу только мои JS файлы из тома хоста, и мой node_modules каталог не видно. Это имеет смысл, основываясь на том, как тома устанавливаются в докере.

Однако я хочу иметь эти node_modules в контейнере для успешного запуска browserify (который ищет эти узловые модули). Есть ли хороший способ сделать это без глобальной установки узлов в контейнере или установки модулей на главной машине?

Спасибо за ваш вклад.

+0

У меня точно такая же проблема. Вы случайно нашли рабочее решение? – Spock

+0

Основываясь на ответе, отмеченном правильно, в котором говорится: «Вы можете смонтировать в качестве тома каталог node_modules, чтобы избежать загрузки всех зависимостей за все время создания нового контейнера», мне пришлось иметь свой каталог 'node_modules', который был бы совместно использован с главной машины , Таким образом, при первом запуске контейнера он загружал модули узла в общий том и был доступен каждый раз, когда контейнер запускался. – akotian

ответ

1

Контейнеры должны быть лицами без гражданства. Если вы уничтожите контейнер, все данные внутри него будут уничтожены. Вы можете установить в качестве тома каталог node_modules, чтобы избежать загрузки всех зависимостей все время, когда вы создаете новый контейнер. Смотрите этот пример, который устанавливает browserify раз:

### docker-compose.yml 
node: 
    image: node:5.9.1 
    working_dir: /js_scripts 
    command: npm install browserify 
    volumes: 
    - $PWD/host_js_files:/js_scripts 

Первое, вы должны запустить docker-compose up и подождать, пока не будут установлены все пакеты. После этого вы должны запустить команду браузера как:

docker-compose run node /js_scripts/node_modules/.bin/browserify /js_scripts/main.js -o /js_scripts/bundle.js 
1

Неплохая идея смешать файлы хоста с файлами-контейнерами докеров при совместном использовании папок. После удаления контейнера докеры удаляются все данные контейнеров. Докер должен знать, какие файлы принадлежат контейнерам и какие хосты (Docker удаляет весь внутренний контейнер, кроме томов). У вас есть два варианта смешивания файлов хоста и контейнера вместе:

  1. Поместить файлы контейнера в объем после того, как контейнер был запущен. (Плохая идея, файлы-контейнеры не будут удалены после удаления контейнера)
  2. Вы можете разместить свои скрипты хоста в подпапку в /js_scripts или объявить все ваши скрипты отдельно:

    -v ./host_js_files/script1.js: /js_script/script1.js -v ./host_js_files/script2.js:/js_script/script2.js

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