[Docker] 효율적인 Dockerfile 작성하기, 작성 시 주의사항

이주희·2022년 11월 17일
0

Docker

목록 보기
16/16

Good 👍

  • 하나의 명령어를 \로 나눠서 가독성을 높인다.

  • .dockerignore 파일을 작성해 불필요한 파일을 빌드 컨텍스트에 포함하지 않는다.

  • 빌드 캐시를 이용해 기존에 사용했던 이미지 레이어를 재사용한다.

  • &&로 각 RUN 명령을 하나로 묶어 하나의 RUN으로 여러 개의 명령어를 실행하도록 작성한다.
    여러 개의 RUN 명령어가 하나로 묶이면 이미지 레이어의 개수 또한 하나로 줄어든다.

  • 다른 사람이 빌드한 이미지에 불필요한 이미지 레이어가 들어있다면 해당 이미지로 컨테이너를 생성하고 docker export, import 명령어를 사용해 컨테이너를 이미지로 만듦으로써 이미지의 크기를 줄인다.


Bad ❌

  • Dockerfile을 아무렇게나 작성하면 저장 공간을 불필요하게 차지하는 이미지나 레이어가 너무 많은 이미지가 생성될 수 있다.

비효율적인 빌드 예시

FROM ubuntu:14.04
RUN mkdir /test
RUN fallocate -1 100m /test/dummy # 100MB 크기의 파일을 가상으로 만들어 컨테이너에 할당하고, 이를 이미지 레이어로 빌드한다.
RUN rm /test/dummy # 파일을 삭제한다.

# 빌드가 완료되어 최종 생성된 이미지에는 100MB 크기의 `/dummy` 파일이 존재하지 않는다.
  • 위 Dockerfile로 빌드한 이미지의 크기는 ubuntu:14.04 이미지에 100MB를 더한 약 290MB를 차지한다.

  • RUN rm /test/dummy으로 파일을 삭제했으므로/test/dummy는 존재하지 않는다.

  • 컨테이너를 이미지로 생성할 때 컨테이너에서 변경된 사항만 새로운 이미지 레이어로 생성하는 방식의 단점 중 하나이다.

  • 파일을 삭제하더라도 이는 파일을 삭제했다는 변경사항으로서 레이어로 새롭게 저장될 뿐, 실제 100MB 크기의 파일은 이전 레이어에 남아있다.

  • 실제로 컨테이너에서 사용하지 못하는 파일이 이미지 레이어로 존재하기 때문에 의미 없는 저장 공간을 차지하게 된 것이다.


개선안

FROM ubuntu:14.04
RUN mkdir /test && \
RUN fallocate -1 100m /test/dummy&& \
RUN rm /test/dummy
  • &&로 각 RUN 명령을 하나로 묶는다.

  • 여러 개의 RUN 명령어가 하나로 묶여 이미지 레이어의 개수 또한 하나로 줄어든다.

profile
🍓e-juhee.tistory.com 👈🏻 이사중

0개의 댓글