하나의 명령어를 \
로 나눠서 가독성을 높인다.
.dockerignore
파일을 작성해 불필요한 파일을 빌드 컨텍스트에 포함하지 않는다.
빌드 캐시를 이용해 기존에 사용했던 이미지 레이어를 재사용한다.
&&
로 각 RUN 명령을 하나로 묶어 하나의 RUN으로 여러 개의 명령어를 실행하도록 작성한다.
여러 개의 RUN 명령어가 하나로 묶이면 이미지 레이어의 개수 또한 하나로 줄어든다.
다른 사람이 빌드한 이미지에 불필요한 이미지 레이어가 들어있다면 해당 이미지로 컨테이너를 생성하고 docker export, import
명령어를 사용해 컨테이너를 이미지로 만듦으로써 이미지의 크기를 줄인다.
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 명령어가 하나로 묶여 이미지 레이어의 개수 또한 하나로 줄어든다.