コンテンツにスキップ

スクリプト開発 / プリ実行スクリプト

バージョン 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 の依存関係をインストール
1
2
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 を読み取って、値が serverworker かを判断できます。

Beat サービス、MySQL サービス、Redis サービスはプリ実行スクリプトを実行しません

区別に使用する参考 Bash コードは次のとおりです。

Worker コンテナでのみ実行
1
2
3
if [ $1 != 'worker' ]; then
    exit 0
fi
Server コンテナでのみ実行
1
2
3
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 は正常に起動しません。

プリ実行スクリプトの実行過程を確認する必要がある場合は、次のコマンドで追跡できます。

コンテナログを表示
1
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
取得:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates InRelease [128 kB]
取得:3 http://ports.ubuntu.com/ubuntu-ports jammy-backports InRelease [127 kB]
取得:4 http://ports.ubuntu.com/ubuntu-ports jammy-security InRelease [129 kB]
取得:5 http://ports.ubuntu.com/ubuntu-ports jammy-updates/universe arm64 Packages [1528 kB]
取得:6 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 Packages [2960 kB]
取得:7 http://ports.ubuntu.com/ubuntu-ports jammy-updates/restricted arm64 Packages [3920 kB]
取得:8 http://ports.ubuntu.com/ubuntu-ports jammy-backports/main arm64 Packages [82.8 kB]
取得:9 http://ports.ubuntu.com/ubuntu-ports jammy-backports/universe arm64 Packages [33.3 kB]
取得:10 http://ports.ubuntu.com/ubuntu-ports jammy-security/universe arm64 Packages [1230 kB]
取得:11 http://ports.ubuntu.com/ubuntu-ports jammy-security/main arm64 Packages [2656 kB]
取得:12 http://ports.ubuntu.com/ubuntu-ports jammy-security/restricted arm64 Packages [3777 kB]
16.6 MB を 18 秒で取得しました (923 kB/s)
パッケージリストを読み込んでいます...
パッケージリストを読み込んでいます...
依存関係ツリーを構築しています...
状態情報を読み込んでいます...
libxext6 はすでに最新バージョン (2:1.3.4-1build1) です。
libxext6 は手動インストールとして設定されました。
以下の追加パッケージがインストールされます:
  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
提案パッケージ:
  libx11-doc libxcb-doc
以下の新しいパッケージがインストールされます:
  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 個、新規インストール: 43 個、削除: 0 個、更新: 27 個。
38.4 MB のアーカイブを取得する必要があります。
この操作の後、163 MB の追加ディスク容量が使用されます。
取得:1 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libglib2.0-0 arm64 2.72.4-0ubuntu2.5 [1435 kB]
取得:2 http://ports.ubuntu.com/ubuntu-ports jammy-updates/main arm64 libglib2.0-data all 2.72.4-0ubuntu2.5 [4656 B]
取得:3 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 shared-mime-info arm64 2.1-2 [453 kB]
取得:4 http://ports.ubuntu.com/ubuntu-ports jammy/main arm64 xdg-user-dirs arm64 0.17-2ubuntu4 [53.5 kB]
取得: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 パッケージをインストール
1
pip install -u simplejson

「プリ実行スクリプト」は Func の起動前に実行されるため、PIP でインストールされたパッケージはユーザースクリプトだけでなく、DataFlux Func 全体にも影響します

したがって、使用する際は、これらの操作が DataFlux Func 自体の動作に影響を与えないことを確認してください。