与resin.io一起部署时,如何更新node-red / node-red-docker映像中的settings.js?

时间:2018-10-28 10:00:03

标签: docker dockerfile node-red

我正在使用具有以下内容的Dockerfile,该文件是我在树莓派上使用resin.io进行部署的。

FROM nodered/node-red-docker:rpi-v8
USER root
RUN sudo setcap 'cap_net_bind_service=+ep'  $(eval readlink -f `which node`)
USER node-red

我还想更新Node-RED使用的settings.js,但我不知道该怎么做。

我已经创建了文件settings.js,并在RUN命令之后将以下行添加到了Dockerfile中……它确实由resin.io进行了构建和部署,没有任何错误。

COPY settings.js /data/

...但是在检查/data/文件夹时,我发现settings.js没有更新。我仍然可以看到旧的settings.js,它是由先前的部署和容器的启动自动创建的。

仅供参考,我的容器/data文件夹中的内容:

node-red@997563c:~$ ls -l /data
total 24
-rw-r--r-- 1 node-red node-red  283 Oct 28 08:57 flows.json
drwxr-xr-x 3 node-red node-red 4096 Oct 27 10:44 lib
drwxr-xr-x 3 root     root     4096 Oct 26 22:27 node-red
-rw-r--r-- 1 node-red node-red  120 Oct 27 16:44 package.json
-rw-r--r-- 1 node-red node-red 8091 Oct 27 10:44 settings.js
node-red@997563c:~$

此处仅供参考,下面是容器日志文件的内容,其中涉及Node-RED应用程序的启动:

28.10.18 11:18:03 (+0100) Starting service 'main sha256:472f9797c9288bc3d5a9147597fd33fb982ab34f4eb0e467f70842f05a421f3b'
28.10.18 11:18:04 (+0100)  main  mount: only root can use "--types" option
28.10.18 11:18:04 (+0100)  main  mount: only root can use "--move" option
28.10.18 11:18:04 (+0100)  main  mount: only root can use "--move" option
28.10.18 11:18:04 (+0100)  main  mount: only root can use "--move" option
28.10.18 11:18:04 (+0100)  main  mount: only root can use "--move" option
28.10.18 11:18:04 (+0100)  main  umount: /dev: umount failed: Operation not permitted
28.10.18 11:18:04 (+0100)  main  mount: only root can use "--move" option
28.10.18 11:18:04 (+0100)  main  ln: cannot remove ‘/dev/ptmx’: Permission denied
28.10.18 11:18:04 (+0100)  main  mount: only root can use "--types" option
28.10.18 11:18:04 (+0100)  main  /sbin/udevd
28.10.18 11:18:04 (+0100) Started service 'main sha256:472f9797c9288bc3d5a9147597fd33fb982ab34f4eb0e467f70842f05a421f3b'
28.10.18 11:18:05 (+0100)  main  npm info it worked if it ends with ok
28.10.18 11:18:05 (+0100)  main  npm info using npm@5.0.3
28.10.18 11:18:05 (+0100)  main  npm info using node@v8.1.3
npm info lifecycle node-red-docker@1.0.0~prestart: node-red-docker@1.0.0
npm info lifecycle node-red-docker@1.0.0~start: node-red-docker@1.0.0
28.10.18 11:18:05 (+0100)  main
28.10.18 11:18:05 (+0100)  main  > node-red-docker@1.0.0 start /usr/src/node-red
28.10.18 11:18:05 (+0100)  main  > node $NODE_OPTIONS node_modules/node-red/red.js -v $FLOWS "--userDir" "/data"
28.10.18 11:18:05 (+0100)  main
28.10.18 11:18:08 (+0100)  main  28 Oct 10:18:08 - [info]
28.10.18 11:18:08 (+0100)  main
28.10.18 11:18:08 (+0100)  main  Welcome to Node-RED
28.10.18 11:18:08 (+0100)  main  ===================
28.10.18 11:18:08 (+0100)  main
28.10.18 11:18:08 (+0100)  main  28 Oct 10:18:08 - [info] Node-RED version: v0.19.4
28.10.18 11:18:08 (+0100)  main  28 Oct 10:18:08 - [info] Node.js  version: v8.1.3
28.10.18 11:18:08 (+0100)  main  28 Oct 10:18:08 - [info] Linux 4.14.39 arm LE
28.10.18 11:18:09 (+0100)  main  28 Oct 10:18:09 - [info] Loading palette nodes
28.10.18 11:18:12 (+0100)  main  28 Oct 10:18:12 - [info] Settings file  : /data/settings.js
28.10.18 11:18:12 (+0100)  main  28 Oct 10:18:12 - [info] Context store  : 'default' [module=memory]
28.10.18 11:18:12 (+0100)  main  28 Oct 10:18:12 - [info] User directory : /data
28.10.18 11:18:12 (+0100)  main  28 Oct 10:18:12 - [warn] Projects disabled : editorTheme.projects.enabled=false
28.10.18 11:18:12 (+0100)  main  28 Oct 10:18:12 - [info] Flows file     : /data/flows.json
28.10.18 11:18:12 (+0100)  main  28 Oct 10:18:12 - [info] Server now running at http://127.0.0.1:80/
28.10.18 11:18:12 (+0100)  main  28 Oct 10:18:12 - [warn]
28.10.18 11:18:12 (+0100)  main
28.10.18 11:18:12 (+0100)  main  ---------------------------------------------------------------------
28.10.18 11:18:12 (+0100)  main  Your flow credentials file is encrypted using a system-generated key.
28.10.18 11:18:12 (+0100)  main
28.10.18 11:18:12 (+0100)  main  If the system-generated key is lost for any reason, your credentials
28.10.18 11:18:12 (+0100)  main  file will not be recoverable, you will have to delete it and re-enter
28.10.18 11:18:12 (+0100)  main  your credentials.
28.10.18 11:18:12 (+0100)  main
28.10.18 11:18:12 (+0100)  main  You should set your own key using the 'credentialSecret' option in
28.10.18 11:18:12 (+0100)  main  your settings file. Node-RED will then re-encrypt your credentials
28.10.18 11:18:12 (+0100)  main  file using your chosen key the next time you deploy a change.
28.10.18 11:18:12 (+0100)  main  ---------------------------------------------------------------------
28.10.18 11:18:12 (+0100)  main
28.10.18 11:18:12 (+0100)  main  28 Oct 10:18:12 - [info] Starting flows
28.10.18 11:18:12 (+0100)  main  28 Oct 10:18:12 - [info] Started flows

仅供参考,我的docker容器的df输出:

node-red@997563c:~$ df
Filesystem     1K-blocks   Used Available Use% Mounted on
none             6794760 748316   5677608  12% /
tmpfs              65536      0     65536   0% /dev
/dev/mmcblk0p6   6794760 748316   5677608  12% /data
none              306201 245637     40494  86% /lib/modules
tmpfs             499556      0    499556   0% /tmp/resin
shm                65536      0     65536   0% /dev/shm
tmpfs             499556  10024    489532   3% /host/run/dbus
node-red@997563c:~$

第一次更新(2018-10-28):

以下2个链接描述了如何将settings.js作为node-RED的Docker构建脚本的一部分提供。因此从技术上讲是可行的,但目前我不知道如何使用官方的nodered/node-red-docker存储库

  1. https://github.com/resin-io-projects/balena-node-red
  2. https://medium.com/@knolleary/deploying-node-red-applications-to-devices-using-resin-io-58d2042cdb0c

2 个答案:

答案 0 :(得分:1)

好的,所以问题将是`/ data'被安装在docker映像中的任何内容之上。

/data的内容将由您推送到resin.io设备的早期版本的Docker映像确定。

我可以看到2个选项:

  1. 擦除整个图像,然后重新开始。这仅适用于您“正在玩”游戏。在生产环境中是不可能的。
  2. 登录容器并编辑/替换settings.js并重新启动

答案 1 :(得分:0)

根本原因:

此问题实际上是由于以下事实:resin.io使用/data文件夹进行持久性存储,并且仅在首次为该设备创建容器时才能将文件复制到此文件夹。因此,容器的后续部署不会更改/data文件夹的内容。

这在https://docs.resin.io/learn/develop/runtime/#persistent-storage中也有描述。相关部分复制粘贴如下:

  

永久存储

     

如果您有要通过应用程序和主机OS更新保留的数据或配置,则可以选择将其保留在永久存储中。永久存储是写系统日志和其他应用程序数据的好地方,即使您的代码更改,这些日志也应保持不变

     

...

     

resinOS v2.12.0及更高版本

     

从resinOS v2.12.0开始,永久   存储通过命名卷处理。行为很   与旧版主机OS上的永久性存储相同。实际上,对于   单容器应用程序,默认设置docker-compose.yml   名为树脂数据的卷,该卷链接到目录中的/data目录   容器。此版本与早期版本之间的唯一区别是   通过主机操作系统访问此数据的操作是在   / var / lib / docker / volumes / _resin-data / _data,而不是   / mnt / data / resin-data /与早期主机OS一起使用的位置   版本。

     

命名卷可以被赋予任意名称,并且可以链接到   目录放在一个或多个容器中。只要每次发布   应用程序包含docker-compose.yml,卷名不   更改后,该卷中的数据将在更新之间保持不变。

     

使用命名卷时,请注意:

     

如果将设备移至新应用程序,则旧的/data文件夹将   自动清除。 在构建过程中,数据已添加到   配置为链接到命名卷的容器目录将   会在首次在设备上创建该卷时将其复制到该卷中。

解决方案:

为了确保有效执行Dockerfile中的以下指令:

COPY settings.js /data/

您必须在resin.io信息中心中执行以下步骤。

  1. 创建一个虚拟应用程序
  2. 将设备移至虚拟应用程序
  3. 将设备移回原始应用程序

第2步将确保/data文件夹被完全擦除。

第3步将确保settings.js被有效地复制到/data文件夹,因为这是该映像第一次在该设备上部署。

仅供参考:URL https://docs.resin.io/learn/manage/actions/#move-to-another-application描述了移至另一个应用程序的操作。

在该页面上,您还可以找到以下语句:

  

警告::对于运行resinOS 2.12.0及更高版本的设备,数据位于   永久存储(命名卷)在以下情况下会自动清除:   设备已移至新应用程序。