클라우드와 컨테이너의 기초
FROM alpine
COPY data.tar.gz /tmp/
RUN tar -xzf /tmp/data.tar.gz -C /opt && rm /tmp/data.tar.gz500 MB의 아카이브 data.tar.gz를 풀기 위해 위의 Dockerfile로 이미지를 만들었다. 압축을 푼 뒤 같은 RUN 안에서 아카이브를 삭제했는데도, 이미지 크기는 아카이브만큼 큰 채로였다. 이유와 대책의 조합으로 가장 적절한 것은?
- A&& 뒤의 rm은 빌드할 때는 실행되지 않기 때문이다. rm을 별도의 RUN 명령으로 나누어 쓴다
- B삭제한 파일이 빌드 캐시로서 이미지에 남기 때문이다. docker build에 --no-cache를 붙여 다시 빌드한다
- CCOPY 명령이 만든 레이어에 아카이브가 남기 때문이다. 멀티 스테이지 빌드로, 압축을 푼 파일만 최종 이미지에 복사한다
정답과 해설 보기
정답: C. COPY 명령이 만든 레이어에 아카이브가 남기 때문이다. 멀티 스테이지 빌드로, 압축을 푼 파일만 최종 이미지에 복사한다
Dockerfile의 명령 중 파일 시스템을 바꾸는 것(COPY나 RUN 등)은 각각 하나의 레이어가 되며, 이미지는 그 레이어들을 겹친 것입니다. 나중 레이어에서 파일을 삭제해도 삭제했다는 표시가 위 레이어에 기록될 뿐이어서, COPY 레이어에 들어간 500 MB의 아카이브는 이미지에 남습니다. 멀티 스테이지 빌드로 압축 해제를 다른 스테이지에서 수행하고 압축을 푼 파일만 COPY --from으로 마지막 스테이지에 가져오면, 아카이브는 최종 이미지에 포함되지 않습니다. 다운로드와 압축 해제와 삭제를 하나의 RUN 안에서 수행하는 방법도 있지만, COPY로 가져온 파일에는 쓸 수 없습니다.