2.4. 다단계 빌드가 포함된 사용자 정의 부팅 가능한 이미지의 이점
배포 이미지에는 빌드 툴 또는 불필요한 라이브러리를 추가하지 않고도 애플리케이션과 필수 런타임만 포함해야 합니다. 이를 위해 두 단계의 Containerfile
: 하나의 스테이지를 사용하여 아티팩트를 빌드하고 애플리케이션을 호스팅하십시오.
다중 단계 빌드에서는 Containerfile
에서 여러 FROM
명령을 사용합니다. 각 FROM
명령은 다른 기반을 사용할 수 있으며 각 명령은 빌드의 새 단계를 시작합니다. 아티팩트를 한 단계에서 다른 단계로 선택적으로 복사하고 최종 이미지에 필요하지 않은 모든 항목을 제외할 수 있습니다.
다단계 빌드는 다음과 같은 몇 가지 이점을 제공합니다.
- 작은 이미지 크기
- 빌드 환경을 런타임 환경에서 분리하면 필요한 파일과 종속 항목만 최종 이미지에 포함되어 크기를 크게 줄일 수 있습니다.
- 보안 개선
- 빌드 도구 및 불필요한 라이브러리는 최종 이미지에서 제외되므로 공격 면적이 줄어들어 더 안전한 컨테이너가 생성됩니다.
- 최적화된 성능
- 이미지 크기가 작으면 컨테이너화된 애플리케이션의 전반적인 효율성을 개선하여 다운로드, 배포 및 시작 시간이 빨라집니다.
- 단순화된 유지 관리
- 빌드 및 런타임 환경이 분리되어 있으면 최종 이미지가 더 깔끔하고 유지 관리하기 쉬워 애플리케이션을 실행하는 데 필요한 항목만 포함됩니다.
- cleaner 빌드
- 다단계 빌드는 빌드 프로세스 중에 누적될 수 있는 중간 파일에서 혼동을 방지하여 필수 아티팩트만 최종 이미지로 만들 수 있도록 합니다.
- 리소스 효율성
- 한 단계에서 빌드하고 불필요한 부분을 삭제하는 기능을 통해 배포 중 스토리지 및 대역폭 사용을 최소화할 수 있습니다.
- 계층 캐싱 개선
- Podman은 명확하게 정의된 단계를 통해 이전 단계의 결과를 효율적으로 캐시하여 향후 빌드 속도를 높일 수 있습니다.
다음 Containerfile
은 다음 두 단계로 구성됩니다. 첫 번째 단계는 일반적으로 builder
라고 하며 golang 바이너리를 컴파일합니다. 두 번째 단계는 첫 번째 단계에서 바이너리를 복사합니다. go-toolset 빌더의 기본 작업 디렉터리는 opt/ap-root/src
입니다.
결과적으로 최종 컨테이너 이미지에 helloworld
바이너리가 포함되지만 이전 단계의 데이터는 포함되지 않습니다.
다중 단계 빌드를 사용하여 다음 시나리오를 수행할 수도 있습니다.
- 특정 빌드 단계에서 중지
- 이미지를 빌드할 때 지정된 빌드 단계에서 중지할 수 있습니다. 예를 들면 다음과 같습니다.
podman build --target build -t hello .
$ podman build --target build -t hello .
예를 들어 이 방법을 사용하여 특정 빌드 단계를 디버깅할 수 있습니다.
- 외부 이미지를 스테이지로 사용
-
COPY --from
명령을 사용하여 로컬 이미지 이름, 로컬 또는 컨테이너 레지스트리에서 사용 가능한 태그 또는 태그 ID를 사용하여 별도의 이미지에서 복사할 수 있습니다. 예를 들면 다음과 같습니다.
COPY --from=<image> <source_path> <destination_path>
COPY --from=<image> <source_path> <destination_path>
- 이전 단계를 새 단계로 사용
-
FROM
명령을 사용하여 이전 단계가 종료된 위치를 계속할 수 있습니다. 예를 들면 다음과 같습니다.