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 not work properly due to missing dependency libraries.

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

Otherwise, the following issues may occur:

dependency-error.png

1. Using Pre-execution Scripts to Resolve Dependencies

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

The specific steps are as follows:

1.1 Preparing the Script

The DataFlux Func image is based on Ubuntu:22.04.

To solve the OpenCV dependency issue mentioned above, 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 this as a file named prepare-for-opencv.sh.

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

Differentiating Execution Environments

DataFlux Func consists of a Server and a Worker.

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

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

To differentiate the environment, you can read $1 to determine if the value is server or worker.

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

Reference Bash code for differentiation:

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 Uploading the Script

The pre-execution script storage directory is as follows:

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

Users can place pre-execution scripts in the host machine directory.

Alternatively, users can upload their own pre-execution scripts via the file management in DataFlux Func:

enable-file-manager.png

upload-script.png

script-ready.png

1.3 Restarting Func and Verifying

After completing all preparations, restart DataFlux Func.

Execute the previous script again, and you will see that the opencv-python library can now be imported correctly:

import-ok.png

2. Pre-execution Script Execution Details

Every time DataFlux Func starts, it first checks if there are any pre-execution scripts.

When pre-execution scripts exist, DataFlux Func executes them in order based on the script names, and DataFlux Func will only start normally if all scripts execute successfully.

To observe the execution process of pre-execution scripts, you can use the following command to track:

View Container Logs
1
docker logs {DataFlux Func Container ID} -f

Using the pre-execution script from above as an example, the output will be as follows:

Execution Logs
 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 libgl1-mesa-glx 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]

...

As you can see, the pre-execution script executed correctly and installed the required dependency packages.

3. Replacing Python Packages in the Image

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

In such cases, the "pre-execution script" can also be used to replace the package, for example:

Install the Latest Version of simplejson Package
1
pip install -u simplejson

Since the "pre-execution script" is executed before Func starts, the package installed via PIP not only affects the user's script but also the entire DataFlux Func.

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