我希望这很简单。我正在使用 Docker 在 Raspberry Pi 4 上运行 Homeassistant 和 Node-Red 容器。
基于本指南他们建议制作一个 DockerFile 来安装 Node-Red 节点以支持 Homeassistant。安装通过npm
Node-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 从中提取的基础映像相同的名称来标记本地构建的映像。image
image
FROM
这意味着每次重建容器(第一次构建之后)实际上都将使用其自身的先前版本作为基础容器,而不是使用nodered/node-red
上游的版本。
image
要解决这个问题,只需将撰写文件中的指令值更改为其他值;例如local-custom-node-red