기존의 프로그램에서 버그를 수정을 위해 코드를 수정하여 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"라는 문구와 함께 레디스에 연결할 수 없다는 오류가 나타났다.

-Dspring.profiles.active를 local로 설정하였음에도 불구하고 왜 이미지에 반영이 되지 않는 것일까?docker-compose up 명령어는 기존 이미지가 존재할 시에, 이미지를 재빌드하지 않는다.
따라서 기존에 이미지가 있다면 Dockerfile 이 수정되었더라도 이미지에 변경사항이 적용되지 않는다.
$ ./gradlew clean
$ ./gradlew build
$ docker compose up --build
build 를 해도 Dockerfile 의 변경사항을 캐시로 처리해서 변경이 되지 않는 경우가 있다고 한다.
그럴 때는 이미지 빌드 시 캐시를 사용하지 않도록 옵션을 붙혀주면 된다.
$ docker compose up --force-recreate
docker 에서는 layer를 쌓을 때 cache를 이용해서 이미지 빌드와 컨테이너 생성 시간을 줄인다.
이 cache 데이터는 이미지와 컨테이너를 제거하더라도 로컬에 남아있다.
cache 가 계속 쌓이는 것이 장점이 크긴 하지만 단점도 있다.
$ docker system prune -a