리그캣의 개발놀이터

[Docker] Docker image merge 또는 combine 본문

인프라/Docker

[Docker] Docker image merge 또는 combine

리그캣 2019. 12. 19. 11:18

도커 이미지 또는 컨테이너 두개 이상을 합치는게 가능할까??

 

Prometheus + grafana 컨테이너 합치기..

 

일단 merge 기능에 대해서 찾아보았다.

 

https://abdelrahmanhosny.wordpress.com/2015/07/11/how-to-merge-two-docker-images/

 

  1. 둘다의 history 가져와 하나의 Dockerfile 가져오는 기능이 있는데
    Prometheus Grafana Dockerfile 모두 로컬의 데이터를 가져오는 기능뿐만 아니라 From에서 조차 이전의 이미지를 참고참고하여 버전업 하던 방식이라 Dockerfile history 기능을 사용하여도 merge 없다.

 

  1. Grafana + prometheus 이미지를 사람 찾아보기. Docker hub에 몇 개가 있는듯 해보였지만 개인적으로 사용하고 있으며, dockerfile 제대로 보이지 않음. 또한 github소스 또한 비공개, 추가적으로, 해당 이미지가 정말 두개를 합친건지도 미지수

 

https://stackoverflow.com/questions/39626579/is-there-a-way-to-combine-docker-images-into-1-container

 

그러던 다단계 빌드에 대해서 찾았음. (도커엔진 1.7 이상)

다단계 빌드를 추천하지 않는 사람들도 있지만 한번 시도해보기로 ..

 

https://docs.docker.com/develop/develop-images/multistage-build/

 

 

먼저 dockerfile 아래와 같이 구성한 build 해보았다.

[root@kong test]# Dockerfile

FROM golang:1.7.3

WORKDIR /go/src/github.com/alexellis/href-counter/

RUN go get -d -v golang.org/x/net/html

 

FROM alpine:latest

RUN apk --no-cache add ca-certificates

WORKDIR /root/

COPY --from=0 /go/src/github.com/alexellis/href-counter/app .

CMD ["./app"]

 

 

```bash

docker build -t alexellis2/href-counter:latest .

```

된다….

신기해서 prometheus + grafana 조합을 작성해서 build 해보았다.

 

FROM prom/prometheus:latest

ADD prometheus.yml /etc/prometheus/

 

 

FROM grafana/grafana:latest

USER root

ARG GF_INSTALL_IMAGE_RENDERER_PLUGIN="false"

RUN if [ $GF_INSTALL_IMAGE_RENDERER_PLUGIN = "true" ]; then \

    echo "http://dl-cdn.alpinelinux.org/alpine/edge/community" >> /etc/apk/repositories && \

    echo "http://dl-cdn.alpinelinux.org/alpine/edge/main" >> /etc/apk/repositories && \

    echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" >> /etc/apk/repositories && \

    apk --no-cache  upgrade && \

    apk add --no-cache udev ttf-opensans chromium && \

    rm -rf /tmp/* && \

    rm -rf /usr/share/grafana/tools/phantomjs; \

fi

USER grafana

ENV GF_RENDERER_PLUGIN_CHROME_BIN="/usr/bin/chromium-browser"

RUN if [ $GF_INSTALL_IMAGE_RENDERER_PLUGIN = "true" ]; then \

    grafana-cli \

        --pluginsDir "$GF_PATHS_PLUGINS" \

        --pluginUrl https://github.com/grafana/grafana-image-renderer/releases/latest/download/plugin-linux-x64-glibc-no-chromium.zip \

        plugins install grafana-image-renderer; \

fi

ARG GF_INSTALL_PLUGINS=""

RUN if [ ! -z "${GF_INSTALL_PLUGINS}" ]; then \

    OLDIFS=$IFS; \

        IFS=','; \

    for plugin in ${GF_INSTALL_PLUGINS}; do \

        IFS=$OLDIFS; \

        grafana-cli --pluginsDir "$GF_PATHS_PLUGINS" plugins install ${plugin}; \

    done; \

fi

 

 

오오 된다!!!

 

아.. 그런데 보니깐 첫번째 From은 무시가되는것 같다. 나같은경우에는

두가지 port를(grafana, prometheus) 열고 해당 port로 접속을 시도해보니 뒤에 from인 grafana만 접속이 된다..;;

역시 merge는 할 수없는것인가. .ㅠㅠ

 

docker 다단계를 좀 더 자세히 보니 --from=0 이라는 구문이 추가되어있다. 해당 내용을 보니 merge랑은 다른 기능으로 특정 dockerfile from에 이름을 지정해서 해당 from부터만 dockerfile로 인식을 시키던가 이전 단계 빌드된 아티팩트를 사용하는 기능으로 merge와는 거리가 멀어보엿다.. 

Comments