DockerFile 和 docker-compose(Homeassistant 和 Node-red 节点)

DockerFile 和 docker-compose(Homeassistant 和 Node-red 节点)

我希望这很简单。我正在使用 Docker 在 Raspberry Pi 4 上运行 Homeassistant 和 Node-Red 容器。

基于本指南他们建议制作一个 DockerFile 来安装 Node-Red 节点以支持 Homeassistant。安装通过npmNode-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将触发重建的标志,无论是否存在具有相同标签的图像。


我认为您遇到的第二个问题(这也是基于我使用示例配置的修改版本运行的快速测试)是您在每次构建时都覆盖了基本图像标签。

根据build指令上的 Compose 文件参考部分(第三块位于此链接) 当为服务同时指定build和时(如您的服务一样),docker 将根据 build 指令构建映像,然后使用 image 指令的值对其进行标记。由于docker-compose 文件中的指令和dockerfile 中的指令使用相同的标记,因此您告诉 Docker 使用与 dockerfile 从中提取的基础映像相同的名称来标记本地构建的映像。imageimageFROM

这意味着每次重建容器(第一次构建之后)实际上都将使用其自身的先前版本作为基础容器,而不是使用nodered/node-red上游的版本。

image要解决这个问题,只需将撰写文件中的指令值更改为其他值;例如local-custom-node-red

相关内容