跳转至

脚本开发 / 预执行脚本

此功能于 2.6.18 版本新增

重要提示

从 2.6.22 版本开始目录名从原先的init-scripts改为pre-run-scripts

同时,新版本会自动将init-scripts下所有文件拷贝至pre-run-scripts,用户无需额外操作

虽然 DataFlux Func 已经提供了 PIP 工具安装第三方 Python 包,但可能会因为缺少依赖库无法正常使用。

如用户需要在 DataFlux Func 中使用 OpenCV 时,除了安装opencv-python外,还需要通过 apt 等方式安装依赖库。

否则可能会产生如下问题:

1. 使用预执行脚本解决依赖

为解决此问题,可以向 DataFlux Func 提供预执行脚本,预执行脚本会在 DataFlux Func 启动前执行,借此安装必要的依赖。

具体操作步骤如下:

1.1 准备脚本

DataFlux Func 的镜像基于 Ubuntu:20.04,APT 源使用清华大学 TUNA(http://mirrors.tuna.tsinghua.edu.cn/ubuntu)。

以解决上文中的 OpenCV 依赖问题为例,可以准备如下 Bash 脚本。

Bash
1
2
3
4
5
6
7
8
9
# 只需要在 Worker 端执行的脚本
# 根据 $1 值进行区分
if [ $1 != 'worker' ]; then
    exit 0
fi

# 安装 OpenCV 依赖
apt-get update
apt-get install -y libgl1-mesa-glx libglib2.0-0 libsm6 libxext6 libxrender-dev

将其保存为prepare-for-opencv.sh文件。

文件名随意,但必须为.sh结尾。为避免不必要的麻烦,文件名不要使用中文或其他非常规符号

区分运行环境

DataFlux Func 包含 Server 端和 Worker 端。

  • Server 端主要是 HTTP 服务器,提供 Web 页面和 HTTP API,并不参与 Python 代码执行。
  • Worker 端为实际的 Python 代码执行服务。

因此,在绝大部分情况下,预执行脚本只需要在 Worker 中执行即可。

需要区分所在环境时,可以读取$1,判断值为server还是worker

Beat 服务、MySQL 服务、Redis 服务不会执行预执行脚本

用于区分的参考 Bash 代码如下:

Bash
1
2
3
4
# 只在 Worker 端执行
if [ $1 != 'worker' ]; then
    exit 0
fi
Bash
1
2
3
4
# 只在 Server 端执行
if [ $1 != 'server' ]; then
    exit 0
fi

1.2 上传脚本

预执行脚本存放目录如下:

环境 位置
容器内 /data/resources/pre-run-scripts/
宿主机内 {安装目录}/data/resources/pre-run-scripts/

用户可以在宿主机将预执行脚本放入其中。

也可以在 DataFlux Func 的文件管理中进入并上传自行编写的预执行脚本:

1.3 重启 DataFlux Func 并验证

完成所有准备工作后,重新启动 DataFlux Func

回到之前的脚本再次执行,可以看到opencv-python库已经可以正确导入了:

2. 预执行脚本执行细节

每次 DataFlux Func 启动时,都会首先检查是否存在预执行脚本。

当存在预执行脚本时,DataFlux Func 按照预执行脚本的名称排序,依次执行,且必须所有的脚本都执行成功后 DataFlux Func 才会正常启动。

如果需要观察预执行脚本的执行过程,可以通过如下命令跟踪:

Bash
1
docker logs {DataFlux Func 容器 ID} -f

以上文中的预执行脚本为例,可以看到输出如下:

Text Only
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
Hit:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal InRelease
Get:2 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates InRelease [114 kB]
Get:3 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-backports InRelease [108 kB]
Get:4 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-security InRelease [114 kB]
Get:5 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/restricted amd64 Packages [2277 kB]
Get:6 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/multiverse amd64 Packages [31.2 kB]
Get:7 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/universe amd64 Packages [1329 kB]
Get:8 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 Packages [3111 kB]
Get:9 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-security/main amd64 Packages [2629 kB]
Get:10 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-security/restricted amd64 Packages [2139 kB]
Get:11 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-security/universe amd64 Packages [1033 kB]
Get:12 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-security/multiverse amd64 Packages [28.5 kB]
Fetched 12.9 MB in 4s (3104 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
libxext6 is already the newest version (2:1.3.4-0ubuntu1).
libxext6 set to manually installed.
The following additional packages will be installed:
  libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm-nouveau2 libdrm-radeon1
  libdrm2 libgl1 libgl1-mesa-dri libglapi-mesa libglib2.0-data libglvnd0
  libglx-mesa0 libglx0 libice6 libllvm12 libpciaccess0 libpthread-stubs0-dev
  libvulkan1 libwayland-client0 libx11-dev libx11-xcb1 libxau-dev
  libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 libxcb-randr0
  libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcb1-dev libxdmcp-dev libxfixes3
  libxrender1 libxshmfence1 libxxf86vm1 mesa-vulkan-drivers shared-mime-info
  x11-common x11proto-core-dev x11proto-dev xdg-user-dirs xorg-sgml-doctools
  xtrans-dev
Suggested packages:
  pciutils libx11-doc libxcb-doc
The following NEW packages will be installed:
  libdrm-amdgpu1 libdrm-common libdrm-intel1 libdrm-nouveau2 libdrm-radeon1
  libdrm2 libgl1 libgl1-mesa-dri libgl1-mesa-glx libglapi-mesa libglib2.0-0
  libglib2.0-data libglvnd0 libglx-mesa0 libglx0 libice6 libllvm12
  libpciaccess0 libpthread-stubs0-dev libsm6 libvulkan1 libwayland-client0
  libx11-dev libx11-xcb1 libxau-dev libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0
  libxcb-present0 libxcb-randr0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0
  libxcb1-dev libxdmcp-dev libxfixes3 libxrender-dev libxrender1 libxshmfence1
  libxxf86vm1 mesa-vulkan-drivers shared-mime-info x11-common
  x11proto-core-dev x11proto-dev xdg-user-dirs xorg-sgml-doctools xtrans-dev
0 upgraded, 48 newly installed, 0 to remove and 62 not upgraded.
Need to get 39.6 MB of archives.
After this operation, 538 MB of additional disk space will be used.
Get:1 http://mirrors.tuna.tsinghua.edu.cn/ubuntu focal-updates/main amd64 libglib2.0-0 amd64 2.64.6-1~ubuntu20.04.4 [1287 kB]

... 中略

Setting up libx11-dev:amd64 (2:1.6.9-2ubuntu1.2) ...
Setting up libxrender-dev:amd64 (1:0.9.10-1) ...
Setting up libglx-mesa0:amd64 (21.2.6-0ubuntu0.1~20.04.2) ...
Setting up libglx0:amd64 (1.3.2-1~ubuntu0.20.04.2) ...
Setting up libgl1:amd64 (1.3.2-1~ubuntu0.20.04.2) ...
Setting up libgl1-mesa-glx:amd64 (21.2.6-0ubuntu0.1~20.04.2) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
[YAML Resource] Config Overrided by: `/data/user-config.yaml`
Start upgrade process...
Database Timezone: +00:00
Already up to date, skip.
[YAML Resource] Config Overrided by: `/data/user-config.yaml`
Database Timezone: +00:00
Web Server is listening on port [ 8088 ]  (Press CTRL+C to quit)
PID: 766
Have fun!

可以看到,预执行脚本正确执行并安装了所需的依赖包。