여러 소스 이미지에서 새 이미지 생성
이 단계에서는 여러 소스 이미지의 내용을 결합하여 새로운 Docker 이미지를 생성하는 방법을 배우겠습니다. 이는 서로 다른 기본 이미지 또는 사전 구축된 이미지의 구성 요소를 포함하는 이미지를 빌드해야 할 때 흔히 발생하는 시나리오입니다.
먼저, 필요한 소스 이미지를 가져오겠습니다. 예시로 ubuntu 및 alpine 이미지를 사용합니다.
docker pull ubuntu:latest
docker pull alpine:latest
이미지가 가져와지고 있음을 나타내는 출력을 볼 수 있습니다.
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
이제 Dockerfile을 사용하여 새 이미지를 생성합니다. Dockerfile은 사용자가 명령줄에서 이미지를 조립하기 위해 호출할 수 있는 모든 명령을 포함하는 텍스트 문서입니다. ~/project 디렉토리에 Dockerfile이라는 새 파일을 만듭니다.
nano ~/project/Dockerfile
다음 내용을 Dockerfile에 추가합니다.
FROM ubuntu:latest AS base
FROM alpine:latest AS alpine_base
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
COPY --from=base /etc/os-release /app/ubuntu-release
WORKDIR /app
CMD ["ls", "-l"]
이 Dockerfile을 자세히 살펴보겠습니다.
FROM ubuntu:latest AS base: 이 줄은 빌드의 첫 번째 단계의 기본 이미지를 ubuntu:latest로 설정하고 이 단계를 base로 명명합니다.
FROM alpine:latest AS alpine_base: 이 줄은 alpine:latest를 기본 이미지로 사용하여 새 빌드 단계를 시작하고 이 단계를 alpine_base로 명명합니다. 이는 여러 단계의 빌드이며, 단계 간에 파일을 복사할 수 있습니다.
COPY --from=alpine_base /etc/alpine-release /app/alpine-release: 이 명령은 alpine_base 단계에서 현재 단계의 /app/alpine-release 디렉토리로 /etc/alpine-release 파일을 복사합니다.
COPY --from=base /etc/os-release /app/ubuntu-release: 이 명령은 base 단계에서 현재 단계의 /app/ubuntu-release 디렉토리로 /etc/os-release 파일을 복사합니다.
WORKDIR /app: 이는 후속 지침의 작업 디렉토리를 /app으로 설정합니다.
CMD ["ls", "-l"]: 이는 이 이미지에서 컨테이너가 시작될 때 실행할 기본 명령을 지정합니다. /app 디렉토리의 내용을 나열합니다.
Ctrl + X, Y, Enter를 눌러 Dockerfile을 저장합니다.
이제 docker build 명령을 사용하여 이미지를 빌드합니다. 명령 끝의 .은 빌드 컨텍스트 (현재 디렉토리, ~/project) 를 지정합니다.
docker build -t my-multi-stage-image:latest ~/project
다양한 단계가 실행되는 것을 포함하여 빌드 프로세스를 나타내는 출력을 볼 수 있습니다.
[+] Building
...
Successfully built <image_id>
Successfully tagged my-multi-stage-image:latest
빌드가 완료되면 로컬 이미지를 나열하여 이미지가 생성되었는지 확인할 수 있습니다.
docker images my-multi-stage-image
새로 생성된 이미지가 목록에 표시됩니다.
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> About a minute ago ...MB
마지막으로, 이 이미지에서 컨테이너를 실행하여 복사된 파일을 확인해 보겠습니다.
docker run --rm my-multi-stage-image:latest
--rm 플래그는 종료 시 컨테이너를 자동으로 제거합니다. 출력은 ubuntu 및 alpine 이미지에서 복사된 파일을 표시해야 합니다.
total 8
-rw-r--r-- 1 root root 25 Aug 24 10:00 alpine-release
-rw-r--r-- 1 root root 281 Aug 24 10:00 ubuntu-release
이는 다단계 빌드를 사용하여 여러 소스 이미지의 내용을 결합하여 이미지를 성공적으로 생성했음을 확인합니다.