이것이 점프 투 공작소

도커 Base Image를 통한 이미지 빌드하기 본문

도커

도커 Base Image를 통한 이미지 빌드하기

겅겅겅 2023. 7. 30. 18:15

도커 이미지 레이어

도커 이미지는 여러 레이어를 통해 만들어집니다.

도커 파일에서 사용되는 FROM, COPY, RUN, ADD 모두 생성되는 최종 이미지에 대한 레이어가 됩니다.

레이어들은 도커 이미지 빌드 시 임시 컨테이너에 추가되었다가 모든 작업이 완료되면 실제 이미지 파일에 적재됩니다.

 

베이스 이미지 생성용 도커파일

자바 application 이미지를 만들기 위해 자바가 설치된 우분투OS를 Base Image로 사용합니다.

FROM ubuntu:hirsute
CMD ["bash"]
RUN /bin/sh -c set -eux; 	apt-get update; 	apt-get install -y --no-install-recommends 		ca-certificates p11-kit 	; 	rm -rf /var/lib/apt/lists/*
ENV JAVA_HOME=/usr/local/openjdk-11
ENV PATH=/usr/local/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV LANG=C.UTF-8
ENV JAVA_VERSION=11.0.13
# OS에 맞게 Java를 설치합니다.
RUN /bin/sh -c set -eux; 		arch="$(dpkg --print-architecture)"; 	case "$arch" in 		'amd64') 			downloadUrl='https://github.com/AdoptOpenJDK/openjdk11-upstream-binaries/releases/download/jdk-11.0.13%2B8/OpenJDK11U-jdk_x64_linux_11.0.13_8.tar.gz'; 			;; 		'arm64') 			downloadUrl='https://github.com/AdoptOpenJDK/openjdk11-upstream-binaries/releases/download/jdk-11.0.13%2B8/OpenJDK11U-jdk_aarch64_linux_11.0.13_8.tar.gz'; 			;; 		*) echo >&2 "error: unsupported architecture: '$arch'"; exit 1 ;; 	esac; 		savedAptMark="$(apt-mark showmanual)"; 	apt-get update; 	apt-get install -y --no-install-recommends 		dirmngr 		gnupg 		wget 	; 	rm -rf /var/lib/apt/lists/*; 		wget --progress=dot:giga -O openjdk.tgz "$downloadUrl"; 	wget --progress=dot:giga -O openjdk.tgz.asc "$downloadUrl.sign"; 		export GNUPGHOME="$(mktemp -d)"; 	gpg --batch --keyserver keyserver.ubuntu.com --recv-keys EAC843EBD3EFDB98CC772FADA5CD6035332FA671; 	gpg --batch --keyserver keyserver.ubuntu.com --keyserver-options no-self-sigs-only --recv-keys CA5F11C6CE22644D42C6AC4492EF8D39DC13168F; 	gpg --batch --list-sigs --keyid-format 0xLONG CA5F11C6CE22644D42C6AC4492EF8D39DC13168F 		| tee /dev/stderr 		| grep '0xA5CD6035332FA671' 		| grep 'Andrew Haley'; 	gpg --batch --verify openjdk.tgz.asc openjdk.tgz; 	gpgconf --kill all; 	rm -rf "$GNUPGHOME"; 		mkdir -p "$JAVA_HOME"; 	tar --extract 		--file openjdk.tgz 		--directory "$JAVA_HOME" 		--strip-components 1 		--no-same-owner 	; 	rm openjdk.tgz*; 		apt-mark auto '.*' > /dev/null; 	[ -z "$savedAptMark" ] || apt-mark manual $savedAptMark > /dev/null; 	apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false; 		{ 		echo '#!/usr/bin/env bash'; 		echo 'set -Eeuo pipefail'; 		echo 'trust extract --overwrite --format=java-cacerts --filter=ca-anchors --purpose=server-auth "$JAVA_HOME/lib/security/cacerts"'; 	} > /etc/ca-certificates/update.d/docker-openjdk; 	chmod +x /etc/ca-certificates/update.d/docker-openjdk; 	/etc/ca-certificates/update.d/docker-openjdk; 		find "$JAVA_HOME/lib" -name '*.so' -exec dirname '{}' ';' | sort -u > /etc/ld.so.conf.d/docker-openjdk.conf; 	ldconfig; 		java -Xshare:dump; 		fileEncoding="$(echo 'System.out.println(System.getProperty("file.encoding"))' | jshell -s -)"; [ "$fileEncoding" = 'UTF-8' ]; rm -rf ~/.java; 	javac --version; 	java --version
# Java Shell 실행
CMD ["jshell"]

 

자바 11이 설치된 Base Image 빌드

생성된 베이스 이미지 ECR에 PUSH

 

Base Image를 통해 실제 구동할 이미지 생성

먼저 ECR에 존재하는 Base Image를 가져와 레이어를 구성하고

Base Image에 존재하는 아티팩트를 가져와 distroleless로 실제 구동할 이미지를 빌드합니다.

# 이미지 레이어 1 (build-env)
FROM <ECR 이미지 및 태그> AS build-env
COPY . /app/examples
WORKDIR /app
RUN javac examples/*.java
RUN jar cfe main.jar examples.HelloJava examples/*.class 

# 이미지 레이어 2
FROM gcr.io/distroless/java11-debian11
COPY --from=build-env /app /app # 이전 레이어(build-env)에서 빌드한 아티팩트들 COPY
WORKDIR /app
CMD ["main.jar"]

생성된 Base Image를 통해 실제 사용할 이미지 빌드

ECR에 Base Image를 통해 생성된 이미지 PUSH

Base Image를 통해 빌드한 Java 이미지 실행