.png)
Надеюсь, это будет легко. Я использую Docker для запуска контейнеров Homeassistant и Node-Red на Raspberry Pi 4.
На основеэто руководствоони рекомендуют сделать DockerFile для установки узлов Node-Red для поддержки Homeassistant. Установка выполняется с помощью npm
команды внутри контейнера Node-Red.
Я создал оба docker-compose.yaml
и Dockerfile
в каталоге(содержимое файла ниже).
Для загрузки контейнера я использую команду docker-compose up
в каталоге, где docker-compose.yaml
находится файл. Я также создал службу systemd, которая делает то же самое без каких-либо проблем.
Моя проблема в том, что DockerFile
не обрабатывается, когда я запускаюdocker-compose up
Есть ли способ сохранять docker-compose
изменения при DockerFile
каждом запуске/перезапуске контейнера?
[docker-compose.yaml]
version: "3.6"
services:
node-red:
build: .
container_name: node-red
environment:
TZ: /etc/localtime
image: nodered/node-red
restart: unless-stopped
ports:
- "1880:1880"
volumes:
- "/[folders]/node-red/data:/data"
[DockerFile]
FROM nodered/node-red
RUN npm install node-red-contrib-actionflows \
# https://flows.nodered.org/node/node-red-contrib-actionflows
node-red-contrib-home-assistant-websocket \
# https://flows.nodered.org/node/node-red-contrib-home-assistant-websocket
node-red-contrib-stoptimer \
# https://flows.nodered.org/node/node-red-contrib-stoptimer
node-red-contrib-time-range-switch \
# A simple Node-RED node that routes messages depending on the time. If the current time falls within the range specified in the node configuration, the message is routed to output 1. Otherwise the message is routed to output 2.
node-red-contrib-timecheck \
# Is it that time yet? This node compares a given time to the current time.
node-red-node-timeswitch
# node to provide a simple timeswitch node to schedule daily on/off events
решение1
Я только что провел небольшое тестирование и считаю, что у вас здесь две проблемы: одна очевидная, а другая на самом деле очень тонкая.
Первая проблема заключается в том, что Compose не перестраивает автоматически образ сервиса, если образ уже существует. При первом запуске сервиса Compose создаст образ с помощью dockerfile, но при последующих запусках он просто повторно использует уже существующий образ.Документына самом деле, к сожалению, неясны в этом вопросе, но вывод команды при запуске docker-compose up
из вашего файла-образца более полезен:
...
WARNING: Image for service node-red was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
...
Я считаю, что для того, чтобы получить желаемое поведение, вам следует изменить службу systemd, чтобы использовать флаг --build
, который будет запускать пересборку независимо от того, существует ли образ с таким же тегом или нет.
Вторая проблема, с которой, как я полагаю, вы столкнулись (это также основано на быстром тесте, который я провел с использованием измененной версии примеров конфигураций), заключается в том, что вы перезаписываете базовый тег образа при каждой сборке.
Согласно разделу справки по файлу Compose в build
директиве (третий блок снизу)эта ссылка) когда и build
и image
указаны для сервиса, как у вас, docker построит образ в соответствии с директивой build, а затем пометит его с помощью значения директивы image. Поскольку ваша image
директива в файле docker-compose и FROM
директива в dockerfile используют один и тот же тег, вы говорите Docker пометить ваш локально собранный образ тем же именем, что и базовый образ, из которого извлекается ваш dockerfile.
Это означает, что каждая повторная сборка контейнера (после первой сборки) фактически будет использовать предыдущую версию в качестве базового контейнера, а не использовать версию nodered/node-red
из вышестоящего источника.
Чтобы исправить это, просто измените значение директивы image
в файле Compose на что-то другое, например:local-custom-node-red