DockerFile e docker-compose (Homeassistant e nós Node-red)

DockerFile e docker-compose (Homeassistant e nós Node-red)

Espero que esta seja fácil. Estou usando o Docker para executar contêineres Homeassistant e Node-Red em um Raspberry Pi 4.

Baseado emeste guiaeles recomendam criar um DockerFile para instalar nós Node-Red para oferecer suporte ao Homeassistant. A instalação é feita por meio do npmcomando dentro do contêiner Node-Red.

Eu criei ambos docker-compose.yamle Dockerfileem um diretório(conteúdo do arquivo abaixo).

Para inicializar o contêiner eu uso o comando docker-compose upno diretório onde o docker-compose.yamlarquivo está. Também criei um serviço systemd que faz a mesma coisa sem problemas.

Meu problema é que DockerFilenão é processado quando executodocker-compose up

Existe uma maneira de obter docker-composealterações DockerFilesempre que o contêiner for iniciado/reiniciado?

[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

Responder1

Acabei de fazer alguns testes rápidos e acredito que você tenha dois problemas aqui, um é simples e o outro é muito sutil.


O primeiro problema é que o Compose não reconstrói automaticamente a imagem de um serviço se a imagem já existir. Ao executar o serviço pela primeira vez, o Compose criará a imagem usando o dockerfile, mas nas execuções subsequentes ele apenas reutilizará a imagem já existente.Os documentosna verdade, não são claros sobre isso, mas a saída do comando ao executar docker-compose upa partir do seu arquivo de amostra é mais útil:

...
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`.
...

Acredito que, para obter o comportamento que você procura, você deve modificar seu serviço systemd para usar o --buildsinalizador que acionará uma reconstrução, independentemente de existir ou não uma imagem com a mesma tag.


O segundo problema que acredito que você está enfrentando (isso também é baseado em um teste rápido que executei usando uma versão modificada das configurações de exemplo) é que você está substituindo sua tag de imagem base em cada compilação.

De acordo com a seção de referência do arquivo Compose na builddiretiva (terceiro bloco abaixo emesse link) quando ambos builde imagesão especificados para um serviço, como o seu, o docker construirá a imagem de acordo com a diretiva build e a marcará usando o valor da diretiva image. Como sua imagediretiva no arquivo docker-compose e a FROMdiretiva no dockerfile usam a mesma tag, você está dizendo ao Docker para marcar sua imagem construída localmente com o mesmo nome da imagem base da qual seu dockerfile extrai.

Isso significa que cada reconstrução do contêiner (após a primeira construção) usará de fato a versão anterior de si mesmo como contêiner base, em vez de usar o nodered/node-reddo upstream.

Para corrigir isso, basta alterar o valor da imagediretiva no arquivo de composição para outra coisa; por exemplolocal-custom-node-red

informação relacionada