Skip to content

Script Development / Pre-run Scripts

New in version 2.6.18

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

For example, if users need to use OpenCV in DataFlux Func, in addition to installing opencv-python, they also need to install dependency libraries via apt or other means.

Otherwise, the following problems may occur:

dependency-error.png

1. Using Pre-run Scripts to Resolve Dependencies

To solve this problem, you can provide pre-run scripts to DataFlux Func. The pre-run scripts will be executed before DataFlux Func starts, thereby installing the necessary dependencies.

The specific steps are as follows:

1.1 Preparing the Script

The DataFlux Func image is based on Ubuntu:22.04.

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

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 the prepare-for-opencv.sh file.

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

Distinguishing Runtime Environments

DataFlux Func includes a Server side and a Worker side.

  • The Server side is mainly an HTTP server, providing web pages and HTTP APIs, and does not participate in Python code execution.
  • The Worker side is the service that actually executes Python code.

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

When you need to distinguish the current environment, you can read $1 and check whether its value is server or worker.

Beat service, MySQL service, and Redis service will not execute pre-run scripts

The reference Bash code for distinguishing the environment is as follows:

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 storage directory for pre-run scripts is as follows:

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

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

You can also go to File Management in DataFlux Func to upload the pre-run scripts you have written:

enable-file-manager.png

upload-script.png

script-ready.png

1.3 Restart Func and Verify

After completing all preparations, restart DataFlux Func

Go back to the previous script and run it again. You can see that the opencv-python library can now be imported correctly:

import-ok.png

2. Pre-run Script Execution Details

Every time DataFlux Func starts, it first checks whether pre-run scripts exist.

When pre-run scripts exist, DataFlux Func sorts them by name and executes them in sequence, and it will start normally only after all scripts have been executed successfully.

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

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

Taking the pre-run script above as an example, you can see the following output:

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]

...

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

3. Replacing Python Packages in the Image

In some cases, the packages that users need in their scripts are incompatible with the package versions already included in the Func image.

In this case, you can also use "pre-run scripts" to replace packages, for example:

Install the latest simplejson package
1
pip install -u simplejson

Since "pre-run scripts" execute before Func starts, PIP-installed packages affect not only user scripts but also the entire DataFlux Func.

Therefore, when using them, please make sure these operations will not affect the operation of DataFlux Func itself.