ecs 환경변수 적용 안됨
1. ec2 접속해서 해당 컨테이너 접속
docker ps로 접속하고자 하는 컨테이너 아이디 확인
docker exec -it [컨테이너 id] /bin/sh
들어가서, telnet 172.17.0.6 6379
했는데 connected 됨
ping 보내면 pong 옴.
해당 컨테이너에서
$REDIS_HOST 확인해봤는데 잘 되어있음.

그런데도 자꾸 localhost로 적용됨.
도커파일의 문제 같음
좋아. 너가 링크한 글에서처럼 Dockerfile의 ENTRYPOINT와 CMD 사용 방식은 쉘 모드(sh -c)로 설정하지 않으면 환경 변수 치환이 안 되는 문제를 겪게 돼. 지금 너가 겪은 문제도 바로 그거야. 정리해서 설명할게.
✅ 문제 핵심: 환경변수 ${REDIS_HOST}가 Java 실행 시점에 치환되지 않음
Dockerfile에 이렇게 돼 있으면:
ENTRYPOINT ["java", "-jar"]
CMD ["app.jar"]
이건 exec form이고, sh 셸을 거치지 않기 때문에 ${REDIS_HOST} 같은 환경변수는 치환되지 않아.
그래서 application.yml에서 ${REDIS_HOST:172.17.0.6} 이렇게 적었더라도, Java는 그걸 "그냥 문자열"로 받아들여서 기본값인 localhost를 사용하게 돼.
✅ 해결법: 셸 스크립트처럼 실행되도록 변경
✅ 방식 1: sh -c로 감싸기 (추천)
ENTRYPOINT ["sh", "-c"]
CMD ["java -jar app.jar"]
이 구조는 결국 다음과 같은 명령으로 해석됨:
sh -c "java -jar app.jar"
→ 이때 환경변수들이 sh 셸 안에서 먼저 해석되기 때문에 ${REDIS_HOST} 등의 값이 정상 반영됨.
📘 왜 이렇게 해야 할까?
- ENTRYPOINT ["java", "-jar"] → exec form → 환경변수 미해석
- ENTRYPOINT ["sh", "-c"] → shell form → 환경변수 해석 가능
✅ 완성된 Dockerfile 예시
FROM openjdk:17-jdk-slim
WORKDIR /app
# JAR 파일 복사
COPY build/libs/*SNAPSHOT.jar app.jar
# 포트 노출 (예: 8081)
EXPOSE 8081
# 실행
ENTRYPOINT ["sh", "-c"]
CMD ["java -jar app.jar"]
✍️ 추가 팁: application.yml 기본값도 지정해둬
spring:
data:
redis:
host: ${REDIS_HOST:172.17.0.6}
port: 6379
이렇게 하면 환경변수가 없을 때 기본값으로 172.17.0.6이 들어감.
🧪 확인용 로그 코드도 같이 넣기
@PostConstruct
public void logRedisConfig() {
log.info("🔍 Redis 연결 정보 - host: {}, port: {}", redisHost, redisPort);
}
✅ 정리
항목 설명
| 문제 | ${REDIS_HOST}가 Java 실행 시 치환 안 됨 |
| 원인 | ENTRYPOINT ["java", "-jar"]는 exec form |
| 해결 | ENTRYPOINT ["sh", "-c"], CMD ["java -jar app.jar"] 사용 |
| 이점 | 환경변수 치환 가능, Spring에서 정상 인식됨 |
혹시 너가 Gradle 빌드 → Docker 이미지 빌드 → ECS 배포까지 자동화하고 있다면, Dockerfile 수정 후 다시 이미지 빌드해서 푸시하고 태스크 다시 띄우면 정상 연결 확인할 수 있을 거야.
필요하면 build.gradle 쪽도 확인해줄게.