일단 시작.

Docker에서 Spring Boot 프로젝트 build 시 GraphQL 요청을 보내지 못하는 오류 본문

STUDY/Trouble Shooting

Docker에서 Spring Boot 프로젝트 build 시 GraphQL 요청을 보내지 못하는 오류

꾸양! 2024. 4. 18. 17:11

1. Issue Description


▶ 도커에서 compose 스크립트를 이용하여 프로젝트를 빌드하고 Altair에서 http://localhost:8080/graphql 로 쿼리 요청 시

▶ 브라우저 상에서 http://localhost:8080/graphiql 입력 시 

 

2. 원인 추론


1. 도커 컨테이너 IP로 접속

http://{도커_컨테이너_IP_주소}:{컨테이너_포트}/graphiql

→ 응답하는 데 시간이 너무 오래 걸려 실패

 

2. 디버깅

logging.level.root=DEBUG

로그 레벨을 설정하여 도커 컨테이너 터미널에서 디버깅 확인.
→ 포트 접속도 되고 /graphiql로 GET 요청이 들어오는 것까지 확인. 포트 문제인가 했는데 그건 아닌 것 같다. 그런데 response가 나가지 않음.

추측. 혹시 GraphQL Schema 파일을 인지하지 못하는 건가?

  • Schema 파일을 인지하지 못해도 Spring이 실행이 되는가?
    → 실행이 된다. 즉, 실행이 된다고 해도 Schema 파일이 있고 없고는 확인할 수 없다.(간단한 프로젝트 만들어 확인)
  • 여러 번 프로젝트를 로컬, Docker에서 돌리다가 알아 낸 것. GraphQL 스키마 파일을 Spring Boot 에서 잘 확인했을 경우 프로젝트 실행 시 이런 로그가 나와야 한다.

  • 간단한 프로젝트를 만들어 Schema 없이 query 요청을 만들고 프로젝트를 build했는데 똑같이 graphiql 연결이 되지 않는다.

 

3. 도커 내 프로젝트 파일 확인

도커 내 프로젝트 파일을 확인해서 Schema 파일이 존재하는지 확인하려고 했는데 jar 파일로 배포 시 프로젝트 파일 확인이 되지 않는다고 한다.

Spring Boot 어플리케이션을 Jar 파일로 패키징 시 소스 코드가 포함되지 않고, 컴파일된 클래스 파일과 리소스 파일만이 Jar 파일에 포함되기 때문에 도커 내에 내 소스 코드를 복사하지 않는 이상 도커 내에서 프로젝트 파일을 확인할 수 없다.

 

4. application.properties 변경해보기

도커 내 프로젝트에서 디버깅을 해보기 위해 application.properties 에서 다음 옵션을 추가했는 데 디버깅이 되지 않았다.

logging.level.root=DEBUG

즉, application.properties가 도커에서 적용되지 않는다는 것을 알 수 있다.

추측. resources 자체가 Docker에서 적용되지 않는 것인가?

Dockerfile에서 로컬 코드에 있는 application.properties를 도커에 직접 복사하고 설정 파일 경로를 바꿔주니 application.properties가 잘 적용이 되었다.

COPY src/main/resources/application.properties /app/application.properties
ENTRYPOINT ["java","-jar","app.jar", "--spring.config.location=/app/application.properties"]

 

3. 해결


  1. Dockerfile 코드에 Schema file을 COPY하는 코드 추가
  2. application.properties에 Schema 경로 지정

Dockerfile

FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
VOLUME /tmp
COPY build/libs/*.jar /app/app.jar
COPY src/main/resources/application.properties /app/application.properties
COPY src/main/resources/graphql /app/graphql
ENTRYPOINT ["java","-jar","app.jar", "--spring.config.location=/app/application.properties"]

application.properties

spring.graphql.schema.locations=file:/app/graphql/**

 

4. 결과


 

Docker Container Log
Altair Query Test