.png)
Espero que esto sea fácil. Estoy usando Docker para ejecutar contenedores Homeassistant y Node-Red en una Raspberry Pi 4.
Residencia enesta guíarecomiendan crear un DockerFile para instalar nodos Node-Red para admitir Homeassistant. La instalación se realiza mediante el npm
comando dentro del contenedor Node-Red.
Creé ambos docker-compose.yaml
y Dockerfile
en un directorio.(contenido del archivo a continuación).
Para iniciar el contenedor utilizo el comando docker-compose up
en el directorio donde docker-compose.yaml
se encuentra el archivo. También creé un servicio systemd que hace lo mismo sin ningún problema.
Mi problema es que DockerFile
no se procesa cuando ejecutodocker-compose up
¿Hay alguna manera de recoger docker-compose
cambios DockerFile
cada vez que se inicia/reinicia el contenedor?
[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
Respuesta1
Acabo de hacer algunas pruebas rápidas y creo que tienes dos problemas aquí, uno es sencillo y el otro es realmente muy sutil.
El primer problema es que Compose no reconstruye automáticamente la imagen de un servicio si la imagen ya existe. Cuando ejecute el servicio por primera vez, Compose creará la imagen utilizando el archivo acoplable, pero en ejecuciones posteriores simplemente reutilizará la imagen ya existente.los documentosEn realidad, esto es frustrantemente confuso, pero el resultado del comando cuando se ejecuta docker-compose up
desde su archivo de muestra es más ú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`.
...
Creo que para obtener el comportamiento que busca, debe modificar su servicio systemd para usar el --build
indicador que activará una reconstrucción independientemente de si existe o no una imagen con la misma etiqueta.
El segundo problema que creo que te estás encontrando (esto también se basa en una prueba rápida que ejecuté usando una versión modificada de las configuraciones de muestra) es que estás sobrescribiendo tu etiqueta de imagen base en cada compilación.
De acuerdo con la sección de referencia del archivo Redactar sobre la build
directiva (tercer bloque hacia abajo eneste enlace) cuando ambos build
y image
se especifican para un servicio, como el suyo, Docker construirá la imagen de acuerdo con la directiva de compilación y luego la etiquetará usando el valor de la directiva de imagen. Debido a que su image
directiva en el archivo docker-compose y la FROM
directiva en el dockerfile usan la misma etiqueta, le está diciendo a Docker que etiquete su imagen creada localmente con el mismo nombre que la imagen base de la que extrae su dockerfile.
Esto significa que cada reconstrucción del contenedor (después de la primera compilación) de hecho utilizará la versión anterior de sí mismo como contenedor base, en lugar de utilizar la versión nodered/node-red
anterior.
Para solucionar este problema, simplemente cambie el valor de la image
directiva en el archivo de redacción por otro; p.ejlocal-custom-node-red