Docker Node-Red: держать установленные узлы вне контейнера

Мне нужно установить в контейнер множество недостающих узлов node-red. Сохранение (названного) контейнера и запуск его с docker start работает нормально.

Теперь я хочу сохранить установленные узлы в отдельном внешнем каталоге. Если я монтирую /data, создаю внешний каталог, он в основном работает, но не помогает, поскольку узлы установлены в ~/node_modules. Если я попытаюсь смонтировать ~/node_modules во внешний каталог, node-red не сможет запуститься.

Итак, что я могу сделать, чтобы установленные мной узлы не зависели от исполняемого контейнера?

РЕДАКТИРОВАТЬ. Тем временем я запустил изображение следующим образом:

#!/bin/bash
sudo -E docker run -it --rm -p 1893:1880 -p 11893:11880 
  \ -e TZ=Europe/Berlin -e NPM_CONFIG_PREFIX=/data/node_modules/ 
  \ -e NODE_PATH=/usr/src/node-red/node_modules:/data/node_modules:/data/node_modules/lib/node_modules 
  \ --log-driver none --mount type=bind,source="$(pwd)"/data,target=/data 
  \ --name myNodeRed nodered/node-red

но дополнительные установленные узлы, которые находятся в каталоге /data/node_modules/lib/node_modules, по-прежнему не видны.

РЕДАКТИРОВАТЬ 2: тем временем я пытался сохранить контейнер. Стало очевидно, что узлы, установленные с использованием npm install -g, полностью игнорируются.


person Michael Hecht    schedule 31.03.2020    source источник
comment
Почему вы отключили выход? Также почему вы передали все параметры NPM / Node_PATH в контейнер, не должно быть необходимости что-либо перемещать.   -  person hardillb    schedule 31.03.2020


Ответы (1)


Пользователь по умолчанию для экземпляра Node-RED внутри контейнера не является пользователем root (как обычно), поэтому вам необходимо убедиться, что любой том, который вы монтируете в папку /data, доступен для записи этому пользователю. Вы можете сделать это, передав идентификатор пользователя в контейнер, чтобы он соответствовал внешнему пользователю, имеющему разрешение на запись в точку монтирования:

docker run -it --rm -v $(pwd)/data:/data -u $USER -e TZ=Europe/Berlin
 \ -p 1893:1880 -p 11893:11880 --log-driver none
 \ --name myNodeRed nodered/node-red

Узлы Node-RED не должны устанавливаться с опцией -g, вы должны использовать сборку в Palette Manager или, если вам действительно нужно использовать командную строку, запустите npm install <node-name> в каталоге /data внутри контейнера (но вам нужно будет перезапустить контейнер для вновь установленных узлов, которые должны быть подобраны, поэтому вы снова должны использовать диспетчер палитры)

person hardillb    schedule 31.03.2020
comment
Спасибо. Отсутствует ссылка на запуск npm install в каталоге / data. Я думаю, что это описывается в сети по крайней мере редко, даже если это так важно, на мой взгляд. - person Michael Hecht; 31.03.2020