자체 컨테이너에서 경량 변환 실행하기
BYOC(Bring your own container)는 필요한 실행 파일과 라이브러리를 넣은 Docker 이미지 위에서 경량 Python 변환을 실행하는 방식입니다. Python 변환이 Foundry의 입력과 출력을 연결하고, 이미지 안의 프로그램이 실제 계산을 담당합니다. F# 애플리케이션이나 기존 VBA 프로그램처럼 Conda 패키지로 준비하기 어려운 실행 환경에도 사용할 수 있습니다.
아래 예제는 GnuCOBOL로 프로그램을 컴파일해 id와 square 열이 있는 CSV를 만들고, Pandas로 읽어 Foundry 테이블에 씁니다. 예제의 정수 1부터 5까지를 입력으로 삼아 제곱을 계산합니다. 프로그램을 빌드 시점에 미리 컴파일한 뒤 실행 파일을 이미지에 복사하는 구성도 가능합니다.
준비할 파일과 위치
| 로컬 파일 | 놓을 위치와 용도 |
|---|---|
| Dockerfile | 로컬 이미지 빌드 폴더에 둡니다. Ubuntu와 GnuCOBOL을 준비합니다. |
| data_generator.cbl | 코드 저장소의 src/resources/data_generator.cbl에 둡니다. 실제 CSV 생성 프로그램입니다. |
| transform.py | 코드 저장소의 변환 모듈에 둡니다. 예를 들어 src/myproject/datasets/cobol.py에 넣습니다. |
컨테이너 워크플로를 관리자가 허용해야 하며, 이미지는 이미지 요구 사항을 만족해야 합니다. BYOC의 숫자 UID는 반드시 5001입니다. 경량 변환을 실행하기 위해 이미지에 Python을 직접 설치할 필요는 없습니다. 실행 파일이 추가로 사용하는 런타임이나 시스템 라이브러리는 이미지 작성자가 준비합니다.
이미지 작성과 등록
제공한 Dockerfile은 ubuntu:jammy에서 coreutils, curl, sed, build-essential, gnucobol을 설치하고 UID 5001로 실행합니다. ubuntu:latest 기반 이미지에서 IL5 또는 FedRAMP 환경의 cURL 명령이 실패하는 경우에는 ubuntu:jammy를 사용합니다.
빌드 폴더에서 아래 명령을 사용합니다. FOUNDRY_CONTAINER_REGISTRY에는 Artifacts 저장소의 실제 이미지 경로를 설정하고, 저장소 화면에서 안내하는 인증을 먼저 마칩니다. 이미지 이름과 태그는 변환의 container_image, container_tag와 일치해야 합니다.
: "${FOUNDRY_CONTAINER_REGISTRY:?Artifacts 저장소에 표시된 이미지 경로를 설정하세요}"
IMAGE="${FOUNDRY_CONTAINER_REGISTRY}/cobol-generator:0.0.1"
docker build --platform linux/amd64 --tag "$IMAGE" .
docker push "$IMAGE"
Docker Artifacts 저장소를 코드 저장소의 Settings > Libraries에 로컬 backing repository로 추가합니다. 코드 저장소의 Python 라이브러리에는 pandas가 필요합니다. Python 패키지 환경과 이미지의 운영체제 패키지는 서로 다른 설정입니다.
COBOL 프로그램이 하는 일
data_generator.cbl은 data.csv를 줄 단위 순차 파일로 엽니다. 첫 줄은 id,square이며, 이후 다섯 줄에는 정수와 그 제곱을 기록합니다. 숫자를 출력 문자열로 변환한 뒤 양쪽 공백을 제거하므로, CSV의 데이터 필드는 1,1부터 5,25까지입니다.
파일 열기, 각 행 쓰기와 파일 닫기를 마칠 때마다 FILE STATUS를 확인합니다. 상태가 00이 아니면 오류 상태를 표준 오류에 기록하고 반환 코드를 1로 설정해 종료합니다. 정상 종료의 반환 코드는 0입니다. 따라서 파일 생성에 실패한 작업을 정상 완료로 처리하지 않습니다.
CSV 생성 프로그램은 현재 작업 디렉터리에 파일을 씁니다. 변환에서는 컴파일과 실행 모두 같은 USER_WORKING_DIR을 사용해 실행 파일과 결과 파일의 위치를 일치시킵니다.
경량 변환과 연결
제공한 transform.py는 다음 설정을 사용합니다.
@transform.using(
my_output=Output("/training/containers/cobol-output")
).with_container(
container_image="cobol-generator",
container_tag="0.0.1",
)
/training/containers/cobol-output은 예제의 출력 위치입니다. 자신의 프로젝트에 쓸 수 있는 실제 데이터셋 경로로 바꾸고, 변환 모듈을 저장소의 파이프라인 발견 범위에 포함합니다.
Foundry는 코드 저장소의 src 아래 파일을 $USER_WORKING_DIR/user_code 아래에 배치합니다. 그러므로 src/resources/data_generator.cbl의 실행 시점 경로는 $USER_WORKING_DIR/user_code/resources/data_generator.cbl입니다. USER_WORKING_DIR은 실행 환경에서 제공하는 값입니다.
변환은 subprocess.run에 인자 목록을 전달해 다음 두 작업을 수행합니다.
cobc -x -free -o에 실행 파일 경로와 COBOL 소스 경로를 전달합니다.-x는 실행 파일 생성,-free는 자유 형식 소스,-o는 결과 실행 파일 위치를 지정합니다.- 생성한 실행 파일을 같은 작업 디렉터리에서 실행합니다.
두 호출 모두 check=True이므로 컴파일이나 실행이 0 이외의 코드로 끝나면 예외가 발생하고, 후속 테이블 쓰기를 수행하지 않습니다. 명령 문자열을 셸에서 해석하지 않으므로 작업 경로에 공백이 있어도 각 인자의 경계가 유지됩니다. 정상 실행 후에는 pd.read_csv로 data.csv를 읽고 my_output.write_table에 전달합니다.
빌드와 운영 조건
BYOC 워크플로는 Preview를 지원하지 않습니다. Build를 실행하면 지정한 이미지의 컨테이너를 인스턴스화하고 변환을 호출합니다. Foundry가 리소스 할당, 로깅, 플랫폼 통신, 권한 적용과 감사 기록을 처리합니다.
이미지나 실행 파일을 바꾸면 새 태그나 digest로 등록하고 변환 설정도 해당 버전으로 갱신합니다. 이미지에 포함된 오래된 런타임의 유지보수와 취약점 대응은 이미지 관리 범위에 포함됩니다. Spark 실행기마다 프로그램을 병렬 배치해야 하는 작업에는 CLI 사이드카 또는 HTTP 사이드카를 사용합니다.