DockerFile и docker-compose (узлы Homeassistant и Node-red)

DockerFile и docker-compose (узлы Homeassistant и Node-red)

Надеюсь, это будет легко. Я использую 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

Связанный контент