指令碼開發 / 預執行指令碼
於 2.6.18 版本新增
雖然 DataFlux Func 已經提供了 PIP 工具安裝第三方 Python 包,但可能會因為缺少依賴庫無法正常使用。
如使用者需要在 DataFlux Func 中使用 OpenCV 時,除了安裝 opencv-python
外,還需要透過 apt 等方式安裝依賴庫。
否則可能會產生如下問題:
![dependency-error.png]()
1. 使用預執行指令碼解決依賴
為解決此問題,可以向 DataFlux Func 提供預執行指令碼,預執行指令碼會在 DataFlux Func 啟動前執行,藉此安裝必要的依賴。
具體操作步驟如下:
1.1 準備指令碼
DataFlux Func 的映象基於 Ubuntu:22.04。
以解決上文中的 OpenCV 依賴問題為例,可以準備如下 Bash 指令碼。
安裝 OpenCV 依賴 |
---|
| apt-get update
apt-get install -y libgl1-mesa-glx libglib2.0-0 libsm6 libxext6 libxrender-dev
|
將其儲存為 prepare-for-opencv.sh
檔案。
檔名隨意,但必須為 .sh
結尾。為避免不必要的麻煩,檔名不要使用 Unicode 或其他非常規符號
區分執行環境
DataFlux Func 包含 Server 端和 Worker 端。
- Server 端主要是 HTTP 伺服器,提供 Web 頁面和 HTTP API,並不參與 Python 程式碼執行。
- Worker 端為實際的 Python 程式碼執行服務。
因此,在絕大部分情況下,預執行指令碼只需要在 Worker 中執行即可。
需要區分所在環境時,可以讀取 $1
,判斷值為 server
還是 worker
。
Beat 服務、MySQL 服務、Redis 服務不會執行預執行指令碼
用於區分的參考 Bash 程式碼如下:
只在 Worker 容器執行 |
---|
| if [ $1 != 'worker' ]; then
exit 0
fi
|
只在 Server 容器執行 |
---|
| if [ $1 != 'server' ]; then
exit 0
fi
|
1.2 上傳指令碼
預執行指令碼存放目錄如下:
環境 |
位置 |
容器內 |
/data/resources/pre-run-scripts/ |
宿主機內 |
{安裝目錄}/data/resources/pre-run-scripts/ |
使用者可以在宿主機將預執行指令碼放入其中。
也可以在 DataFlux Func 的檔案管理中進入並上傳自行編寫的預執行指令碼:
![enable-file-manager.png]()
![upload-script.png]()
![script-ready.png]()
1.3 重啟 Func 並驗證
完成所有準備工作後,重新啟動 DataFlux Func
回到之前的指令碼再次執行,可以看到 opencv-python
庫已經可以正確匯入了:
![import-ok.png]()
2. 預執行指令碼執行細節
每次 DataFlux Func 啟動時,都會首先檢查是否存在預執行指令碼。
當存在預執行指令碼時,DataFlux Func 按照預執行指令碼的名稱排序,依次執行,且必須所有的指令碼都執行成功後 DataFlux Func 才會正常啟動。
如果需要觀察預執行指令碼的執行過程,可以透過如下命令跟蹤:
檢視容器日誌 |
---|
| docker logs {DataFlux Func 容器 ID} -f
|
以上文中的預執行指令碼為例,可以看到輸出如下:
執行日誌 |
---|
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 | [PRERUN SCRIPT] prepare-for-opencv.sh
Hit:1 http://ports.ubuntu.com/ubuntu-ports jammy InRelease
Get:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease [128 kB]
Get:3 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease [127 kB]
Get:4 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease [129 kB]
Get:5 http://ports.ubuntu.com/ubuntu-ports jammy-updates/universe arm64 Packages [1528 kB]
Get:6 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 Packages [2960 kB]
Get:7 http://ports.ubuntu.com/ubuntu-ports jammy-updates/restricted arm64 Packages [3920 kB]
Get:8 http://ports.ubuntu.com/ubuntu-ports jammy-backports/main arm64 Packages [82.8 kB]
Get:9 http://ports.ubuntu.com/ubuntu-ports jammy-backports/universe arm64 Packages [33.3 kB]
Get:10 http://ports.ubuntu.com/ubuntu-ports jammy-security/universe arm64 Packages [1230 kB]
Get:11 http://ports.ubuntu.com/ubuntu-ports jammy-security/main arm64 Packages [2656 kB]
Get:12 http://ports.ubuntu.com/ubuntu-ports jammy-security/restricted arm64 Packages [3777 kB]
Fetched 16.6 MB in 18s (923 kB/s)
Reading package lists...
Reading package lists...
Building dependency tree...
Reading state information...
libxext6 is already the newest version (2:1.3.4-1build1).
libxext6 set to manually installed.
The following additional packages will be installed:
libdrm-amdgpu1 libdrm-common libdrm-nouveau2 libdrm-radeon1 libdrm2 libgl1
libgl1-amber-dri libgl1-mesa-dri libglapi-mesa libglib2.0-data libglvnd0
libglx-mesa0 libglx0 libice6 libllvm15 libpthread-stubs0-dev 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
shared-mime-info x11-common x11proto-dev xdg-user-dirs xorg-sgml-doctools
xtrans-dev
Suggested packages:
libx11-doc libxcb-doc
The following NEW packages will be installed:
libdrm-amdgpu1 libdrm-common libdrm-nouveau2 libdrm-radeon1 libdrm2 libgl1
libgl1-amber-dri libgl1-mesa-dri libgl1-mesa-glx libglapi-mesa libglib2.0-0
libglib2.0-data libglvnd0 libglx-mesa0 libglx0 libice6 libllvm15
libpthread-stubs0-dev libsm6 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 shared-mime-info
x11-common x11proto-dev xdg-user-dirs xorg-sgml-doctools xtrans-dev
0 upgraded, 43 newly installed, 0 to remove and 27 not upgraded.
Need to get 38.4 MB of archives.
After this operation, 163 MB of additional disk space will be used.
Get:1 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libglib2.0-0 arm64 2.72.4-0ubuntu2.5 [1435 kB]
Get:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libglib2.0-data all 2.72.4-0ubuntu2.5 [4656 B]
Get:3 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 shared-mime-info arm64 2.1-2 [453 kB]
Get:4 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 xdg-user-dirs arm64 0.17-2ubuntu4 [53.5 kB]
Get:5 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libdrm-common all 2.4.113-2~ubuntu0.22.04.1 [5450 B]
...
|
可以看到,預執行指令碼正確執行並安裝了所需的依賴包。
3. 替換映象內的 Python 包
某些情況下,使用者在指令碼中所需要的包與已經在 Func 映象中包含的包版本不相容。
此時,也可以使用「預執行指令碼」實現包的替換,如:
安裝最新版 simplejson 包 |
---|
| pip install -u simplejson
|
由於「預執行指令碼」在 Func 啟動前執行,PIP 安裝的包不僅影響使用者指令碼,也會影響整個 DataFlux Func。
因此,在使用時,請確認這些操作不會影響 DataFlux Func 本身的執行。