Skip to content

Script Development / Pre-execution Scripts

Added in version 2.6.18

Although DataFlux Func provides PIP tool for installing third-party Python packages, it may fail to work properly due to missing dependency libraries.

For example, when users need to use OpenCV in DataFlux Func, besides installing opencv-python, it is also necessary to install dependency libraries via apt or other methods.

Otherwise, issues like the following may occur:

dependency-error.png

1. Using Pre-execution Scripts to Resolve Dependencies

To solve this problem, pre-execution scripts can be provided to DataFlux Func. These scripts are executed before DataFlux Func starts, allowing the installation of necessary dependencies.

The specific steps are as follows:

1.1 Prepare the Script

The DataFlux Func image is based on Ubuntu:22.04.

Taking the OpenCV dependency issue mentioned above as an example, the following Bash script can be prepared.

Install OpenCV Dependencies
1
2
apt-get update
apt-get install -y libgl1-mesa-glx libglib2.0-0 libsm6 libxext6 libxrender-dev

Save it as a file named prepare-for-opencv.sh.

The filename can be arbitrary, but it must end with .sh. To avoid unnecessary trouble, do not use Unicode or other non-standard symbols in the filename.

Distinguishing Runtime Environments

DataFlux Func includes a Server side and a Worker side.

  • The Server side is primarily the HTTP server, providing the web interface and HTTP APIs, and does not participate in Python code execution.
  • The Worker side is the actual service for executing Python code.

Therefore, in most cases, pre-execution scripts only need to be executed in the Worker.

When it is necessary to distinguish the environment, you can read $1 to determine if the value is server or worker.

The Beat service, MySQL service, and Redis service do not execute pre-execution scripts.

Reference Bash code for environment distinction:

Execute only in Worker container
1
2
3
if [ $1 != 'worker' ]; then
    exit 0
fi
Execute only in Server container
1
2
3
if [ $1 != 'server' ]; then
    exit 0
fi

1.2 Upload the Script

The storage directory for pre-execution scripts is as follows:

Environment Location
Inside container /data/resources/pre-run-scripts/
On host machine {installation directory}/data/resources/pre-run-scripts/

Users can place pre-execution scripts into this directory on the host machine.

Alternatively, you can enter the file management in DataFlux Func and upload your own pre-execution script:

enable-file-manager.png

upload-script.png

script-ready.png

1.3 Restart Func and Verify

After completing all preparations, restart DataFlux Func.

Return to the previous script and execute it again. You will see that the opencv-python library can now be imported correctly:

import-ok.png

2. Details of Pre-execution Script Execution

Each time DataFlux Func starts, it first checks for the existence of pre-execution scripts.

When pre-execution scripts exist, DataFlux Func executes them in order based on their filenames. DataFlux Func will only start normally after all scripts have executed successfully.

If you need to observe the execution process of the pre-execution scripts, you can track it with the following command:

View container logs
1
docker logs {DataFlux Func container ID} -f

Taking the pre-execution script from the example above, you can see output similar to the following:

Execution Log
 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]

...

It can be seen that the pre-execution script executed correctly and installed the required dependency packages.

3. Replacing Pre-installed Python Packages in the Image

In some cases, the package version required by the user's script is incompatible with the version already included in the Func image.

In such situations, "pre-execution scripts" can also be used to replace packages, for example:

Install the latest version of the simplejson package
1
pip install -u simplejson

Since "pre-execution scripts" are executed before Func starts, the packages installed via PIP affect not only user scripts but the entire DataFlux Func.

Therefore, when using this method, please ensure that these operations do not affect the operation of DataFlux Func itself.