[Docker] Dockerfile ONBUILD 명령
다음 책을 참고하여 작성하였습니다.
www.aladin.co.kr/shop/wproduct.aspx?ItemId=166082298
ONBUILD 명령은 그 다음 빌드에서 실행할 명령을 이미지 안에 설정하기 위한 명령입니다.
예를 들어 Dockerfile에 ONBUILD 명령을 사용하여 어떤 명령을 실행하도록 설정하여 빌드하고 이미지를 작성합니다. 그리고 그 이미지 다른 Dockerfile에서 베이스 이미지로 설정하여 빌드했을 떄 ONBUILD 명령에서 지정한 명령을 실행시킬 수 있습니다.
실행흐름으로 나타나면 다음과 같습니다.
ONBUILD 명령은 자신의 Dockerfile로부터 생성한 이미지를 베이스 이미지로 한 다른 Dockerfile을 빌드할 때 실행하고 싶은 명령을 기술합니다.
예를 들면 웹 시스템을 구축할 때 OS 설치 및 환경 설정이나 웹 서버 설치 및 각종 플러그인 설치 등과 같은 인프라 환경 구축과 관련된 부분을 베이스 이미지로 작성합니다. 이때 ONBUILD 명령으로 이미지 안에 개발한 프로그램을 전개하는 명령(ADD나 COPY 등)을 지정합니다.
어플리케이션 개발자는 어플리케이션의 구축 부분을 코딩하고 이미 작성이 끝난 베이스 이미지를 바탕으로 한 이미지를 작성합니다. 이 이미지 안에는 프로그래밍이 끝난 업무 어플리케이션이 전개됩니다.
다음은 ONBUILD를 활용한 운용 예시 입니다.
예제소스 출처입니다.
github.com/asashiho/dockertext2/tree/master/chap05/onbuild
1. 베이스 이미지 작성
먼저 Ubuntu:17.10을 베이스 이미지로 하여 웹 서버의 실행 환경을 작성합니다.
RUN 명령으로 Nginx를 설치하고, 데몬을 실행하도록 CMD 명령을 지정합니다. 그리고 웹 콘텐츠(website.tar)를 /var/www/html 아래에 배치하는 명령을 ONBUILD 명령으로 지정합니다.
# Dockerfile.base
# 베이스 이미지 설정
FROM ubuntu:17.10
# Nginx 설치
RUN apt-get -y update && apt-get -y upgrade
RUN apt-get -y install nginx
# 포트 지정
EXPOSE 80
# Web 컨텐츠 배치
ONBUILD ADD website.tar /var/www/html/
# Nginx 실행
CMD ["nginx", "-g", "daemon off;"]
이 Dockerfile을 Dockerfile.base라는 이름으로 하고 다음 명령어로 빌드합니다. docker build 시 파일명을 지정할 때는 -f 옵션을 사용합니다.
docker build -t web-base -f Dockerfile.base
Sending build context to Docker daemon 715.3kB
Step 1/6 : FROM ubuntu:16.04
---> aefd7f02ae24
Step 2/6 : RUN apt-get -y update && apt-get -y upgrade
---> Using cache
---> e12c0f392a09
Step 3/6 : RUN apt-get -y install nginx
---> Using cache
---> 1f318be7ed84
Step 4/6 : EXPOSE 80
---> Using cache
---> 2a09ce5bb18f
Step 5/6 : ONBUILD ADD website.tar /var/www/html/
---> Running in 81134a5b362b
Removing intermediate container 81134a5b362b
---> 3444904108c0
Step 6/6 : CMD ["nginx", "-g", "daemon off;"]
---> Running in a3b828ac07ad
Removing intermediate container a3b828ac07ad
---> d4372b8680e5
Successfully built d4372b8680e5
Successfully tagged web-base:latest
Step 5/6에 ONBUILD 명령을 볼 수 있습니다.
2. 웹 콘텐츠 개발
웹 서버를 작동시키기 위한 인프라 실행 환경이 완성되었으므로, 웹 콘텐츠를 구축합니다. 샘플로 HTML 파일이나 CSS파일, 그림 파일 등을 website라는 이름으로 하여 tar 명령을 사용하여 압축합니다. 예제소스에 website.tar 파일을 사용하겠습니다.
3. 웹 서버용 이미지 작성
그 다음 웹 서버 실행용 이미지를 작성합니다. 이 이미지는 1번에서 작성한 베이스 이미지를 FROM 명령으로 지정합니다. Dockerfile은 다음과 같습니다.
# Dockerfile
# 웹 서버용 이미지를 가져옴
FROM web-base
이 Dockerfile을 빌드하면 ONBUILD 명령에서 지정한 웹 컨텐츠(website.tar)를 이미지에 추가하는 처리가 실행되므로 다음과 같은 폴더로 구성합니다.
onbuild/
├── Dockerfile
└── website.tar
이 Dockerfile을 다음과 같이 build 합니다. photoview-image라는 이미지가 생성됩니다.
docker build -t photoview-image .
Sending build context to Docker daemon 715.3kB
Step 1/1 : FROM web-base
# Executing 1 build trigger
---> 5985bade84e9
Successfully built 5985bade84e9
Successfully tagged photoview-image:latest
이미지 생성 후 이미지에서 ONBUILD 명령이 설정되어 있는지 docker image inspect 명령으로 확인할 수 있습니다.
docker image inspect --format="{{ .Config.OnBuild }}" web-base
결과
[ADD website.tar /var/www/html/]
4. 웹 서버용 컨테이너 시작
1번에서 웹 서버를 작동시키기 위한 실행환경과 2번에서 웹 콘텐츠의 전개가 되었으므로 생성된 이미지를 바탕으로 컨테이너를 시작합니다.
docker container run -d -p 80:80 photoview-image
브라우저를 통해 localhost:80으로 접속합니다.
이와 같이 인프라 구축과 관련된 이미지 작성과 애플리케이션 배포와 관련된 이미지 생성을 나눌 수 있습니다.
Dockerfile의 ONBUILD 명령어에 대하여 알아보았습니다.