使用Docker部署Node-RED – 第三部分:修复docker build错误和配置nodesDir

使用 Google/Node.js Runtime 作为基础镜像创建的 Node-RED Docker 镜像,在查看日志时发现在构建过程中出现了错误。具体来说,在 node-icu-charset-detector 模块的 node-gyp rebuild 过程中失败了。尽管当前仍然能够工作,但为了避免出现错误,将重新创建 Docker 镜像。

Docker构建错误

在使用node-gyp构建本地模块时遇到了错误。

$ docker build -t node-red .
...
> node-icu-charset-detector@0.0.7 install /app/node_modules/irc/node_modules/node-icu-charset-detector
> node-gyp rebuild

make: Entering directory `/app/node_modules/irc/node_modules/node-icu-charset-detector/build'
  CXX(target) Release/obj.target/node-icu-charset-detector/node-icu-charset-detector.o
../node-icu-charset-detector.cpp:5:28: fatal error: unicode/ucsdet.h: No such file or directory
compilation terminated.
make: *** [Release/obj.target/node-icu-charset-detector/node-icu-charset-detector.o] Error 1
make: Leaving directory `/app/node_modules/irc/node_modules/node-icu-charset-detector/build'
gyp ERR! build error
gyp ERR! stack Error: `make` failed with exit code: 2
gyp ERR! stack     at ChildProcess.onExit (/nodejs/lib/node_modules/npm/node_modules/node-gyp/lib/bu
ild.js:267:23)
gyp ERR! stack     at ChildProcess.emit (events.js:98:17)
gyp ERR! stack     at Process.ChildProcess._handle.onexit (child_process.js:810:12)
gyp ERR! System Linux 3.13.0-39-generic
gyp ERR! command "node" "/nodejs/lib/node_modules/npm/node_modules/node-gyp/bin/node-gyp.js" "rebuild"
gyp ERR! cwd /app/node_modules/irc/node_modules/node-icu-charset-detector
gyp ERR! node -v v0.10.33
gyp ERR! node-gyp -v v1.0.1
gyp ERR! not ok
npm WARN optional dep failed, continuing node-icu-charset-detector@0.0.7

在构建node-icu-charset-detector时,似乎无法找到unicode/ucsdet.h文件。

../node-icu-charset-detector.cpp:5:28: fatal error: unicode/ucsdet.h: No such file or directory

使用apt-file搜索软件包。

使用apt-file命令搜索unicode/ucsdet.h。 安装libicu-dev包后,可以获得所需的头文件。

$ sudo apt-get update
$ sudo apt-get install apt-file
$ sudo apt-file update
$ apt-file search unicode/ucsdet.h
libicu-dev: /usr/include/x86_64-linux-gnu/unicode/ucsdet.h

谷歌/Node.js运行时

目前的Dockerfile只是将google/nodejs-runtime作为基础镜像来指定。

$ echo FROM google/nodejs-runtime > Dockerfile

我想要安装libicu-dev,但由于使用ONBUILD执行npm install,所以派生的Dockerfile中的npm install会在node-gyp rebuild之后进行,而这就来不及了。

FROM google/nodejs

WORKDIR /app
ONBUILD ADD package.json /app/
ONBUILD RUN npm install
ONBUILD ADD . /app

EXPOSE 8080
CMD []
ENTRYPOINT ["/nodejs/bin/npm", "start"]

决定使用google/nodejs作为基本镜像,重新创建Dockerfile。

重新进行docker build

切换到已克隆的Node-RED目录。

$ cd ~/docker_apps/nod-red

可以通过编辑settings.js文件,指定用于存放额外Node的js和html文件的目录。

js ~/docker_apps/nod-red/settings.js

nodesDir: ‘/data/nodes’,

在容器启动时,将指定的目录(nodesDir)映射到Docker主机的/opt/nodes。

$ mkdir -p /opt/nodes

为了对构建进行测试,我会将-v标志添加到res.js以进行调试。

...
    "scripts"      : {
        "start": "node red.js -v",
        "test": "./node_modules/.bin/grunt"
    },
...

谷歌/Node.js

以下是使用Google/Node.js作为基础镜像的Dockerfile。

FROM google/nodejs

RUN apt-get update && \
  apt-get install -y libicu-dev

WORKDIR /app
ADD package.json /app/
RUN npm install
ADD . /app

EXPOSE 1880
CMD []
ENTRYPOINT ["/nodejs/bin/npm", "start"]

RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*

构建Docker镜像。这次成功地重新构建了node-icu-charset-detector的node-gyp rebuild。

$ cd docker_apps/nod-red
$ docker build -t node-red .
...
> node-icu-charset-detector@0.0.7 install /app/node_modules/irc/node_modules/node-icu-charset-detect
or
> node-gyp rebuild

make: Entering directory `/app/node_modules/irc/node_modules/node-icu-charset-detector/build'
  CXX(target) Release/obj.target/node-icu-charset-detector/node-icu-charset-detector.o
  SOLINK_MODULE(target) Release/obj.target/node-icu-charset-detector.node
  SOLINK_MODULE(target) Release/obj.target/node-icu-charset-detector.node: Finished
  COPY Release/node-icu-charset-detector.node
make: Leaving directory `/app/node_modules/irc/node_modules/node-icu-charset-detector/build'
...
irc@0.3.9 node_modules/irc
├── ansi-color@0.2.1
├── irc-colors@1.1.0 (hashish@0.0.4)
├── node-icu-charset-detector@0.0.7
└── iconv@2.1.5 (nan@1.4.3)
...

为了测试目的,启动一个一次性容器进行调试确认。

$ docker run --rm \
  --name node-red \
  -p 1880:1880 \
  -v /opt/nodes:/data/nodes \
  node-red 
> node-red@0.9.1 start /app
> node red.js -v


Welcome to Node-RED
===================

13 Feb 09:04:53 - [info] Version: 0.9.1.git
13 Feb 09:04:53 - [info] Loading palette nodes
13 Feb 09:04:54 - [warn] ------------------------------------------
13 Feb 09:04:54 - [warn] [arduino] Error: Cannot find module 'arduino-firmata'
13 Feb 09:04:54 - [warn] [rpi-gpio] Info : Ignoring Raspberry Pi specific node.
13 Feb 09:04:54 - [warn] [redisout] Error: Cannot find module 'redis'
13 Feb 09:04:54 - [warn] [mongodb] Error: Cannot find module 'mongodb'
13 Feb 09:04:54 - [warn] ------------------------------------------
13 Feb 09:04:54 - [info] Server now running at http://127.0.0.1:1880/
13 Feb 09:04:54 - [info] Flows file not found : flows_e816455bc0d9.json
13 Feb 09:04:54 - [info] Starting flows

我会在浏览器上进行验证。

广告
将在 10 秒后关闭
bannerAds