[내일배움캠프 Spring 심화] 2024.10.10 WIL - 트러블 슈팅: DockerFile의 수정사항이 이미지에 반영되지 않는 경우가 발생

박상훈·2024년 10월 17일

상황

  • 기존의 프로그램에서 버그를 수정을 위해 코드를 수정하여 docker compose를 이용해 로컬에 spring 프로젝트들을 띄워 두었다.

  • redis의 설정 파일

spring:
  data:
    redis:
      host: host.docker.internal
      port: 6379
---
spring.config.activate.on-profile: local
spring:
  data:
    redis:
      host: host.docker.internal
      port: 6379

---
spring.config.activate.on-profile: dev
spring:
  data:
    redis:
      host: ${redis.host}
      port: 6379
  • 위와 같이 local 환경과 dev 환경의 redis.host가 분리되어 있다. dev 환경의 redis.host는 aws의 Elasticache 주소로 설정되어 있고, 로컬에서 레디스를 띄워 테스트를 진행해 볼 예정이었기에 프로파일 설정을 local로 변경하여 진행하려 하였다.

  • 현재 Dockerfile의 상태

# build 에서 사용할 이미지
FROM gradle:8.10.2-jdk21 AS build

WORKDIR /app

ARG FILE_DIRECTORY

COPY $FILE_DIRECTORY /app

# 실제 컨테이너로 만들 이미지 베이스
FROM openjdk:21-jdk-slim

# build 단계로부터 파일을 가져올 수 있음!
# AS build로 선언해놨기에 --from=build!
COPY --from=build /app/build/libs/*SNAPSHOT.jar /app.jar

CMD ["java", "-Dspring.profiles.active=dev", "-jar", "app.jar"]
  • 위와 같이 -Dspring.profiles.active가 dev로 설정되어 있기에 local로 변경하고 docker compose를 이용해 스프링 프로젝트들을 실행시켰다.

  • 실행 후 모든 프로젝트의 콘솔 창을 살펴 보니

The following 1 profile is active: "dev"

라는 문구와 함께 레디스에 연결할 수 없다는 오류가 나타났다.


해결 과정

  • DockerFile의 -Dspring.profiles.active를 local로 설정하였음에도 불구하고 왜 이미지에 반영이 되지 않는 것일까?

Solution #1.

docker-compose up 명령어는 기존 이미지가 존재할 시에, 이미지를 재빌드하지 않는다.
따라서 기존에 이미지가 있다면 Dockerfile 이 수정되었더라도 이미지에 변경사항이 적용되지 않는다.

  • 따라서 이미지를 모두 지운 뒤 gradle을 이용해 clean 및 build를 수행하고 다시 이미지를 띄워 보았다.
$ ./gradlew clean

$ ./gradlew build

$ docker compose up --build
  • 그러나 오류는 해결되지 않았고, 같은 오류가 반복되어 나타났다.

Solution #2.

build 를 해도 Dockerfile 의 변경사항을 캐시로 처리해서 변경이 되지 않는 경우가 있다고 한다.
그럴 때는 이미지 빌드 시 캐시를 사용하지 않도록 옵션을 붙혀주면 된다.

$ docker compose up --force-recreate
  • 역시나 같은 문제가 반복되었다.

solution #3.

docker 에서는 layer를 쌓을 때 cache를 이용해서 이미지 빌드와 컨테이너 생성 시간을 줄인다.
이 cache 데이터는 이미지와 컨테이너를 제거하더라도 로컬에 남아있다.
cache 가 계속 쌓이는 것이 장점이 크긴 하지만 단점도 있다.

  • 혹시 몰라 로컬의 캐시를 모두 제거 후 다시 이미지를 빌드해보았다.
$ docker system prune -a
  • 나도 몰래 13GB나 쌓여있었던 캐시가 삭제되었고, 이미지를 다시 빌드해 보았다.

The following 1 profile is active: "local"

  • 위의 문구와 함께 버그가 잘 수정되었다❗❗
profile
안녕하세요

0개의 댓글