여러 이미지를 빌드해야하는데 dockerfile 하나로 관리하고 싶을 때가 있다.

방법

dockerfile에 생성할 이미지 마다 베이스를 정의하고(from) 거기다 이름을 붙이면(as) docker build 시에 어떤 이미지를 생성할지 target할 수 있다.

예시

Dockerfile 내용

1.logstash 기본 이미지를 베이스로 하고 내가 필요한 library를 받아서 이 라이브러리를 포함한 새로운 logstash 이미지 생성을 위한 내용.

2.Grafana 기본 이미지를 베이스로 하고 그라파나 로그인 페이지 내용을 수정한 새로운 grafana 이미지 생성을 위한 내용.

여러 이미지 생성을 위한 dockerfile 내용 형식

FROM 베이스_이미지 as 이미지 이름

예시 코드

FROM docker.elastic.co/logstash/logstash:7.13.0 as jihoon-logstash
RUN curl -k -L -O https://jdbc.postgresql.org/download/postgresql-42.2.14.jar
WORKDIR /usr/share/logstash/bin
RUN logstash-plugin install logstash-output-jdbc

FROM grafana/grafana:7.4.3-ubuntu as jihoon-grafana
ADD login_page/grafana_icon.svg /usr/share/grafana/public/img/grafana_icon.svg
ADD login_page/index.html /usr/share/grafana/public/views/index.html
ADD login_page/Branding.tsx /usr/share/grafana/public/app/core/components/Branding/Branding.tsx
ADD login_page/DashboardPage.test.tsx /usr/share/grafana/public/app/features/dashboard/containers/DashboardPage.test.tsx
ADD login_page/DashboardPage.tsx /usr/share/grafana/public/app/features/dashboard/containers/DashboardPage.tsx
ADD login_page/Welcome.tsx /usr/share/grafana/public/app/plugins/panel/welcome/Welcome.tsx
ADD login_page/app.63a9c1d648180e457252.js /usr/share/grafana/public/build/app.63a9c1d648180e457252.js
ADD login_page/app.63a9c1d648180e457252.js.map /usr/share/grafana/public/build/app.63a9c1d648180e457252.js.map

Dockerfile 작성후 도커파일 위치에서 docker build 실행 방법

아래와 같이 docker build를 두번 하고 각각 위에서 이름 붙였던 이미지 이름을 target 옵션으로 명시해준다.

docker build -t jihoon/logstash:7.13.0 --target jihoon-logstash .
docker build -t jihoon/grafana:1.0.0 --target jihoon-grafana .

참고

https://docs.docker.com/develop/develop-images/multistage-build/#stop-at-a-specific-build-stage