Skip to content

스크립트 개발 / 사전 실행 스크립트

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을 읽어 값이 server인지 worker인지 판단하면 됩니다.

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되는 것을 확인할 수 있습니다:

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
적중: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 자체 실행에 영향을 주지 않는지 확인하십시오.