.png)
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 npm
comando dentro do contêiner Node-Red.
Eu criei ambos docker-compose.yaml
e Dockerfile
em um diretório(conteúdo do arquivo abaixo).
Para inicializar o contêiner eu uso o comando docker-compose up
no diretório onde o docker-compose.yaml
arquivo está. Também criei um serviço systemd que faz a mesma coisa sem problemas.
Meu problema é que DockerFile
não é processado quando executodocker-compose up
Existe uma maneira de obter docker-compose
alterações DockerFile
sempre 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 up
a 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 --build
sinalizador 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 build
diretiva (terceiro bloco abaixo emesse link) quando ambos build
e image
sã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 image
diretiva no arquivo docker-compose e a FROM
diretiva 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-red
do upstream.
Para corrigir isso, basta alterar o valor da image
diretiva no arquivo de composição para outra coisa; por exemplolocal-custom-node-red