向 Docker 添加先决条件

简介

该项目在 Docker Hub 上提供了多种不同版本的 Docker 容器,分为两类:

  • 不同的基础 NodeJS 版本。随着新的 NodeJS LTS 版本的发布,相应版本的容器也会添加。
  • 标记为 -minimal 后缀的镜像。这些容器旨在包含运行 Node-RED 和其核心节点所需的绝对库。

具体来说,-minimal 容器不具备构建某些节点组件所需的原生构建工具,这些组件是通过安装它们而触发的。

这两组镜像都基于 NodeJS Alpine 容器。Alpine 是一种 Linux 发行版,旨在提供尽可能小的安装占用,它被用作许多语言运行时容器的基础(例如 NodeJS 和 Python)。作为一系列优化以减小体积的一部分,它使用 musl libc,而不是通常的 glibc 实现。

Musl 与大多数应用程序兼容良好,但在某些情况下可能会导致问题,例如某些 SAP 节点和一些低级视频编解码器。

如果您想扩展提供的 Docker 容器,则需要使用 Alpine 的软件包管理工具 apk 安装其他库或应用程序。

    FROM nodered/node-red:latest
    USER root
    RUN apk add py3-pip py3-numpy py3-pandas py3-scikit-learn
    RUN pip install tensorflow
    USER node-red

基于 Debian 的容器

除了基于 Alpine 的容器外,Node-RED Docker git 项目还包含一个脚本,用于构建基于 Debian Linux 发行版的 Node-RED Docker 容器版本。这是有用的,因为 Debian 是一个更主流的 Linux 发行版,许多节点包括如何安装先决条件的说明。

您可以通过运行以下命令在本地构建这些容器:

  $ git clone https://github.com/node-red/node-red-docker.git
  $ cd node-red-docker/docker-custom
  $ ./docker-debian.sh

这将生成一个名为 testing:node-red-build 的容器,可以如下运行:

  $ docker run -d -p 1880:1880 -v node_red_data:/data --name myNRtest testing:node-red-build

该容器可以扩展以添加您项目所需的先决条件。例如,要为 node-red-contrib-machine-learning 节点添加所需的库,以下 Dockerfile 将扩展之前构建的容器。

  FROM testing:node-red-build
  USER root
  RUN apt-get install -y python3-pip python3-numpy python3-pandas 
  RUN pip install scikit-learn tensorflow
  USER node-red

这可以通过以下命令构建:

  docker build . -t custom-node-red

另一种选择是编辑 Dockerfile.debian 以提前构建依赖项。您可以将软件包添加到 apt-get 行,然后添加一个 pip 来安装未直接打包到 Debian 中的本地 Python 模块。

  ...
  COPY --from=build /usr/src/node-red/prod_node_modules ./node_modules

  # 更改所有权,安装开发工具并清理
  RUN chown -R node-red:root /usr/src/node-red && \
      apt-get update && apt-get install -y build-essential python-dev python3 \ 
      python3-pip python3-numpy python3-pandas && \
      pip install scikit-learn tensorflow && \
      rm -r /tmp/*

  USER node-red
  ...

在这种情况下,您只需重新运行 docker-debian.sh 脚本即可。