도커의 핵심은 레이어라는 말을 들어 보았을 것이다. 도커가 레이어를 재사용하는 강력함은 가상환경을 만드는 시간을 획기적으로 단축시켰고, 이를 통해 사용성을 크게 높일 수 있었다. 레이어라는 개념은 꽤나 복잡하지만, 당장은 도커파일 명령 한 줄이 하나의 레이어라고 생각해도 무방하다.

하지만 도커파일의 레이어를 재사용하는 것이 문제가 되는 경우가 종종 있다. 대표적으로 원격에서 값을 받아오는 경우가 이에 속한다. 도커파일에 아래와 같은 레이어가 있다고 생각해보자.

FROM ubuntu

# ...

RUN git clone <https://hello.world>

https://hello.world 의 값이 변경되는 경우 문제가 된다. 도커 엔진 입장에서는 해당 라인이 변화하지 않았기 때문에, 이 레이어는 과거에 만들어 두었던 것을 재사용해야 한다고 생각하기 때문이다.

이런 문제를 해결하기 위해 아래와 같이 강제로 명령어가 바뀌게 만드는 기법을 사용하는 사람들이 있다(ref1). 이미지를 빌드할 때 IGNORE_CACHE_AFTER_GIT_CLONE 이라는 빌드 변수에 매번 다른 값을 할당하는 방식이다. 이렇게 된다면, RUN echo ${IGNORE_CACHE_AFTER_GIT_CLONE} 명령이 매 실행마다 달라지기 때문에 도커 이미지를 빌드할 때마다 RUN echo ${IGNORE_CACHE_AFTER_GIT_CLONE} 이후 행들이 다시 실행된다.

FROM ubuntu

# ...

ARG IGNORE_CACHE_AFTER_GIT_CLONE

RUN echo ${IGNORE_CACHE_AFTER_GIT_CLONE}

RUN git clone <https://hello.world>

하지만 이것도 나름의 문제를 가진다. IGNORE_CACHE_AFTER_GIT_CLONE 에 값을 추가하는 것을 까먹기가 너무 쉽다는 것이다. 도커파일을 배포하는 경우에도 귀찮은 일이 생긴다. ARG 키워드의 원래 목적은 위와 같이 실행 시마다 매번 달라지는 값을 설정하기 위함이 아니므로 도커파일 사용자 입장에서 불편할 수 있다. 뿐만 아니라 이 목적을 달성하기 위해 총 두 개의 라인이 추가되어 도커 이미지의 크기를 키우는 일에 기여한다.

그렇다고 --no-cache 옵션을 사용할수도 없다. 이 옵션을 사용하는 경우 어떤 레이어는 빌드가 오래 걸리지만 변경될 일이 없어서 캐시를 사용하고 싶더라도 도커파일 전체를 캐시 없이 빌드하기 때문에 우분투 베이스 이미지까지도 다시 다운로드받는 등의 불상사가 필연적으로 생긴다.

그렇다면 특정 레이어까지는 캐시를 사용하고, 특정 레이어부터는 다시 빌드하도록 하는 좋은 방법이 무엇일까? 다행히 2019년부터는 도커에서 --no-cache-filter 옵션을 제공한다(ref2). 의도에 맞는 빌드를 실행할 수 있으니 적극적으로 이용을 검토해보자. 단, 2024년 기준 이 옵션은 buildx (도커 확장) 기능이기 때문에 이를 고려하여 도커파일 배포자가 의도하는대로 실행할 수 있는 환경을 구축해 두어야 한다. 구체적인 사용법에 대해서는 추후 다른 글에서 다룬다.

<aside> 💡 January 31, 2024 이 글에서 소개한 IGNORE_CACHE_AFTER_GIT_CLONEecho 를 이용한 방법이 더이상 의도한대로 동작하지 않으며, 유효하지 않음을 확인했다. 더이상 사용할 생각을 하지 말자!

</aside>


parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.

  1. None

from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.


supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.

  1. None