Search
🌍

bc6_1.4.1. title: git clone 이 컨테이너를 빌드할 때마다 실행되게 하려면 --no-cahce 옵션이나 ARG 키워드를 이용할 수 있지만, 모범 사례는 --no-cache-filter 이다.

생성
🚀 prev note
♻️ prev note
🚀 next note
♻️ next note
14 more properties
도커의 핵심은 레이어라는 말을 들어 보았을 것이다. 도커가 레이어를 재사용하는 강력함은 가상환경을 만드는 시간을 획기적으로 단축시켰고, 이를 통해 사용성을 크게 높일 수 있었다. 레이어라는 개념은 꽤나 복잡하지만, 당장은 도커파일 명령 한 줄이 하나의 레이어라고 생각해도 무방하다.
하지만 도커파일의 레이어를 재사용하는 것이 문제가 되는 경우가 종종 있다. 대표적으로 원격에서 값을 받아오는 경우가 이에 속한다. 도커파일에 아래와 같은 레이어가 있다고 생각해보자.
FROM ubuntu # ... RUN git clone https://hello.world
Docker
복사
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
Docker
복사
하지만 이것도 나름의 문제를 가진다. IGNORE_CACHE_AFTER_GIT_CLONE 에 값을 추가하는 것을 까먹기가 너무 쉽다는 것이다. 도커파일을 배포하는 경우에도 귀찮은 일이 생긴다. ARG 키워드의 원래 목적은 위와 같이 실행 시마다 매번 달라지는 값을 설정하기 위함이 아니므로 도커파일 사용자 입장에서 불편할 수 있다. 뿐만 아니라 이 목적을 달성하기 위해 총 두 개의 라인이 추가되어 도커 이미지의 크기를 키우는 일에 기여한다.
그렇다고 --no-cache 옵션을 사용할수도 없다. 이 옵션을 사용하는 경우 어떤 레이어는 빌드가 오래 걸리지만 변경될 일이 없어서 캐시를 사용하고 싶더라도 도커파일 전체를 캐시 없이 빌드하기 때문에 우분투 베이스 이미지까지도 다시 다운로드받는 등의 불상사가 필연적으로 생긴다.
그렇다면 특정 레이어까지는 캐시를 사용하고, 특정 레이어부터는 다시 빌드하도록 하는 좋은 방법이 무엇일까? 다행히 2019년부터는 도커에서 --no-cache-filter 옵션을 제공한다(ref2). 의도에 맞는 빌드를 실행할 수 있으니 적극적으로 이용을 검토해보자. 단, 2024년 기준 이 옵션은 buildx (도커 확장) 기능이기 때문에 이를 고려하여 도커파일 배포자가 의도하는대로 실행할 수 있는 환경을 구축해 두어야 한다. 구체적인 사용법에 대해서는 추후 다른 글에서 다룬다.
@1/31/2024 이 글에서 소개한 IGNORE_CACHE_AFTER_GIT_CLONEecho 를 이용한 방법이 더이상 의도한대로 동작하지 않으며, 유효하지 않음을 확인했다. 더이상 사용할 생각을 하지 말자!
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료을 보관해 두는 영역입니다.
1.
None
from : 과거의 어떤 원자적 생각이 이 생각을 만들었는지 연결하고 설명합니다.
1.
앞에서는 도커의 RUN 키워드가 어떤 역할인지 설명한다.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는지 연결합니다.
1.
None
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는지 연결합니다.
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되거나 이어지는지를 작성하는 영역입니다.
1.
None
ref : 생각에 참고한 자료입니다.