본문 바로가기
Docker

[Docker] '--no-cache' 옵션

by gungle 2023. 11. 7.

 

도커에서 --no-cache 옵션은 docker build 명령어로 이미지를 생성할 때 캐시를 사용하지 않도록 하는 옵션이다. 기본적으로 도커는 이미지 빌드 시에 이전에 실행된 단계의 결과물을 캐싱하여 동일한 단계를 다시 실행하지 않고 빠르게 이미지를 생성한다. 이 캐싱은 개발 단계에서는 유용하지만 때로는 원치 않는 동작을 일으킬 수 있다.

--no-cache 옵션을 사용하면 캐싱을 사용하지 않고, 이미 존재하는 캐시를 무시하고 매번 새로운 이미지를 빌드한다. 이는 다음과 같이 docker build 명령어를 사용할 때 옵션으로 추가된다:

docker build --no-cache -t <이미지명> <경로>

 

--no-cache 옵션이 유용한 경우

  • 최신 소스나 종속성을 가져와야 할 때: 이전에 캐싱된 빌드 결과를 무시하고 항상 새로운 소스나 종속성을 가져와야 할 때 사용한다.
  • 보안 업데이트나 취약점 수정: 보안 업데이트를 반영하거나 취약점을 수정할 때, 이미지를 이전 캐시 없이 다시 빌드하여 새로운 변경 사항을 반영할 수 있다.
  • 캐시가 문제를 일으킬 때: 가끔 캐시된 데이터가 잘못되어 빌드에 문제를 일으킬 수 있다. 이럴 때 --no-cache 옵션을 사용하여 문제를 해결할 수 있다.

--no-cache 옵션을 사용하면 이미지 빌드 시간이 증가하게 된다. 왜냐하면 캐싱이 없어져 모든 단계를 새롭게 실행해야 하기 때문이다. 하지만 이 옵션을 사용함으로써 항상 최신의 소스나 변경 사항을 반영할 수 있다.

 

--no-cache 옵션이 사용되었는지 판단하기

도커에서 --no-cache 옵션이 사용되었는지 판단하려면 이미지 빌드 로그를 살펴보는 것이 일반적인 방법이다. docker build 명령을 실행할 때 해당 옵션이 함께 사용되었는지 확인할 수 있다.

도커 이미지를 빌드할 때, docker build 명령어를 실행한 콘솔 또는 터미널에서 출력되는 빌드 로그를 살펴보면 사용된 옵션들이 기록되어 있다.

보통 --no-cache 옵션이 사용된 경우 로그에 해당 옵션과 함께 다음과 유사한 내용이 기록된다:

...
[+] Building X.Xs (Y/Y) FINISHED
 => [스텝 번호] RUN --no-cache [커맨드 내용]  # 이 부분에서 --no-cache 사용 여부 확인 가능
...

로그에서 RUN 명령어의 부분을 보면 해당 명령어가 실행된 스텝과 그 내용을 확인할 수 있다. 만약 --no-cache 옵션이 사용되었다면, --no-cache 옵션과 함께 실행된 명령어가 기록될 것이다.

또 다른 방법은 이미지의 메타데이터를 확인하는 것이다. 이미지의 메타데이터는 docker history 명령어로 확인할 수 있다. 이 명령어는 이미지의 생성 과정을 보여준다. 하지만 --no-cache 옵션이 직접적으로 기록되는 것은 아니기 때문에 여기서는 이 옵션을 확인할 수는 없다. 대신, 이미지의 각 레이어별로 명령어들이 표시되어, 해당 레이어에서 --no-cache가 사용되었는지 유추할 수는 있다.

결론적으로, docker build 명령어 실행 로그를 확인하거나 docker history 명령어를 통해 이미지 레이어의 빌드 과정을 확인하여 --no-cache 옵션 사용 여부를 유추할 수 있다.

 

보안적인 관점에서

도커의 --no-cache 옵션은 보안 측면에서 몇 가지 중요한 관련성을 가집니다. 주요한 측면은 다음과 같다:

보안 업데이트 및 취약점 수정:
보안 취약점은 소프트웨어에서 발생하는 일반적인 문제 중 하나이다. 취약점이 발견되면, 소프트웨어 개발자들은 이를 수정하는 패치를 배포한다. 도커 이미지에서도 동일한 이슈가 발생할 수 있다. 이미지의 기반 소프트웨어나 응용프로그램의 취약점이 발견되었을 때, 이미지를 새롭게 빌드하여 해당 취약점을 수정해야 한다.

여기서 --no-cache 옵션은 중요한 역할을 한다. 보안 업데이트를 하기 위해 이미지를 재빌드할 때, 기존 캐시를 사용하지 않고 새로운 레이어로부터 이미지를 구축할 수 있다. 이는 이전 이미지의 캐시를 무시하고 변경된 소스코드나 종속성을 새롭게 가져오게 된다. 이 과정을 통해 최신 보안 패치가 반영된 이미지를 얻을 수 있다.

캐시로 인한 보안 문제:
때로는 이미지 빌드를 위해 이전의 캐시된 데이터를 사용하는 것이 보안 문제를 발생시킬 수 있다. 예를 들어, 소스코드에 포함된 비밀 정보나 암호화된 키 등이 이미지 레이어에 캐시되어 노출될 수 있다. --no-cache 옵션을 사용하면 이러한 민감한 정보가 캐시에 남지 않도록 하여 보안 문제를 방지할 수 있다.

이와 같이, --no-cache 옵션은 이미지 빌드 시 보안 관련 문제를 예방하고, 보안 업데이트를 효과적으로 적용하는 데 도움을 줄 수 있다. 그러나 이 옵션을 사용하면 이미지 빌드 속도가 느려질 수 있으므로, 보안 및 성능 측면을 고려하여 적절한 시점에 사용해야 한다.

 

Reference

https://stackoverflow.com/questions/35594987/how-to-force-docker-for-a-clean-build-of-an-image

 

How to force Docker for a clean build of an image

I have build a Docker image from a Docker file using the below command. $ docker build -t u12_core -f u12_core . When I am trying to rebuild it with the same command, it's using the build cache l...

stackoverflow.com