4.3. S2I(Source-to-Image)를 사용하여 소스 코드에서 이미지 생성

S2I(Source-to-Image)는 애플리케이션 소스 코드를 입력으로 사용하고 어셈블된 애플리케이션을 실행하는 새 이미지를 출력으로 생성하는 이미지를 쉽게 작성할 수 있는 프레임워크입니다.

재현 가능한 컨테이너 이미지를 빌드하는 데 S2I를 사용하는 주요 장점은 개발자가 쉽게 사용할 수 있다는 점입니다. 빌더 이미지 작성자는 이미지에서 최상의 S2I 성능, 빌드 프로세스, S2I 스크립트를 제공하도록 두 가지 기본 개념을 이해해야 합니다.

4.3.1. S2I(Source-to-Image) 빌드 프로세스 이해

빌드 프로세스는 최종 컨테이너 이미지로 통합되는 다음 세 가지 기본 요소로 구성됩니다.

  • 소스
  • S2I(Source-to-Image) 스크립트
  • 빌더 이미지

S2I는 첫 번째 FROM 명령으로 빌더 이미지가 포함된 Dockerfile을 생성합니다. 그런 다음 S2I에서 생성된 Dockerfile은 Buildah로 전달됩니다.

4.3.2. S2I(Source-to-Image) 스크립트를 작성하는 방법

스크립트를 빌더 이미지 내에서 실행할 수 있는 경우 모든 프로그래밍 언어로 S2I(Source-to-Image) 스크립트를 작성할 수 있습니다. S2I는 assemble/run/save-artifacts 스크립트를 제공하는 다양한 옵션을 지원합니다. 이러한 위치는 모두 다음 순서에 따라 각 빌드에서 확인합니다.

  1. 빌드 구성에 지정된 스크립트입니다.
  2. 애플리케이션 소스 .s2i/bin 디렉터리에 있는 스크립트입니다.
  3. 라벨이 io.openshift.s2i.scripts-url인 기본 이미지 URL에 있는 스크립트입니다.

이미지에 지정된 io.openshift.s2i.scripts-url 라벨과 빌드 구성에 지정된 스크립트 모두 다음 양식 중 하나를 취할 수 있습니다.

  • image:///path_to_scripts_dir: S2I 스크립트가 있는 디렉터리에 대한 이미지 내부의 절대 경로입니다.
  • file:///path_to_scripts_dir: S2I 스크립트가 있는 호스트의 디렉터리에 대한 상대 또는 절대 경로입니다.
  • http(s)://path_to_scripts_dir: S2I 스크립트가 있는 디렉터리의 URL입니다.

표 4.2. S2I 스크립트

스크립트설명

assemble

assemble 스크립트는 소스에서 애플리케이션 아티팩트를 빌드하여 이미지 내부의 적절한 디렉터리에 배치합니다. 이 스크립트는 필수입니다. 이 스크립트의 워크플로는 다음과 같습니다.

  1. 선택 사항: 빌드 아티팩트를 복구합니다. 증분 빌드를 지원하려면 save-artifacts도 정의해야 합니다.
  2. 애플리케이션 소스를 원하는 위치에 배치합니다.
  3. 애플리케이션 아티팩트를 빌드합니다.
  4. 아티팩트를 실행할 수 있는 적절한 위치에 설치합니다.

run

run 스크립트는 애플리케이션을 실행합니다. 이 스크립트는 필수입니다.

save-artifacts

save-artifacts 스크립트는 이어지는 빌드 프로세스의 속도를 높일 수 있는 모든 종속 항목을 수집합니다. 이 스크립트는 선택 사항입니다. 예를 들면 다음과 같습니다.

  • Ruby의 경우 Bundler에서 설치한 gems입니다.
  • Java의 경우 .m2 콘텐츠입니다.

이러한 종속 항목은 tar 파일로 수집되어 표준 출력으로 스트리밍됩니다.

usage

usage 스크립트를 사용하면 사용자에게 이미지를 올바르게 사용하는 방법을 알릴 수 있습니다. 이 스크립트는 선택 사항입니다.

test/run

test/run 스크립트를 사용하면 이미지가 올바르게 작동하는지 확인하는 프로세스를 생성할 수 있습니다. 이 스크립트는 선택 사항입니다. 해당 프로세스의 제안된 흐름은 다음과 같습니다.

  1. 이미지를 빌드합니다.
  2. 이미지를 실행하여 usage 스크립트를 확인합니다.
  3. s2i build를 실행하여 assemble 스크립트를 확인합니다.
  4. 선택 사항: s2i build 를 다시 실행하여 save-artifactsassemble 스크립트에서 아티팩트를 저장 및 복원하는지 확인합니다.
  5. 이미지를 실행하여 테스트 애플리케이션이 작동하는지 확인합니다.
참고

test/run 스크립트로 빌드한 테스트 애플리케이션을 배치하도록 제안된 위치는 이미지 리포지토리의 test/test-app 디렉터리입니다.

S2I 스크립트의 예

다음 예제 S2I 스크립트는 Bash로 작성됩니다. 각 예에서는 tar 콘텐츠가 /tmp/s2i 디렉터리에 압축 해제되어 있다고 가정합니다.

assemble 스크립트:

#!/bin/bash

# restore build artifacts
if [ "$(ls /tmp/s2i/artifacts/ 2>/dev/null)" ]; then
    mv /tmp/s2i/artifacts/* $HOME/.
fi

# move the application source
mv /tmp/s2i/src $HOME/src

# build application artifacts
pushd ${HOME}
make all

# install the artifacts
make install
popd

run 스크립트:

#!/bin/bash

# run the application
/opt/application/run.sh

save-artifacts 스크립트:

#!/bin/bash

pushd ${HOME}
if [ -d deps ]; then
    # all deps contents to tar stream
    tar cf - deps
fi
popd

usage 스크립트:

#!/bin/bash

# inform the user how to use the image
cat <<EOF
This is a S2I sample builder image, to use it, install
https://github.com/openshift/source-to-image
EOF