DockerFile y docker-compose (nodos Homeassistant y Node-red)

DockerFile y docker-compose (nodos Homeassistant y Node-red)

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 npmcomando dentro del contenedor Node-Red.

Creé ambos docker-compose.yamly Dockerfileen un directorio.(contenido del archivo a continuación).

Para iniciar el contenedor utilizo el comando docker-compose upen el directorio donde docker-compose.yamlse encuentra el archivo. También creé un servicio systemd que hace lo mismo sin ningún problema.

Mi problema es que DockerFileno se procesa cuando ejecutodocker-compose up

¿Hay alguna manera de recoger docker-composecambios DockerFilecada 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 updesde 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 --buildindicador 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 builddirectiva (tercer bloque hacia abajo eneste enlace) cuando ambos buildy imagese 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 imagedirectiva en el archivo docker-compose y la FROMdirectiva 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-redanterior.

Para solucionar este problema, simplemente cambie el valor de la imagedirectiva en el archivo de redacción por otro; p.ejlocal-custom-node-red

información relacionada