0과 1 사이
[Spring boot] JAR 파일에 application.yml 파일이 포함되지 않는 이유 본문
Docker로 Spring boot application을 띄울 때 다음과 같이 application.yml 파일을 지정해줘야만 application.yml을 인식할 수 있었다. 지정하지 않으면 다음과 같은 오류가 발생함.
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.
위 오류는 application.yml를 못읽을 때 발생하는 오류이다.
FROM openjdk:17.0.1-jdk-slim AS builder
LABEL authors="minjuko"
# 필요한 파일들만 복사
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
COPY application.yml .
# gradle 실행 권한 부여 및 빌드
RUN chmod +x ./gradlew
RUN ./gradlew bootJar
FROM openjdk:17.0.1-jdk-slim
# 빌드 결과물을 실행 컨테이너에 복사
COPY --from=builder build/libs/*.jar app.jar
COPY --from=builder application.yml .
# 애플리케이션 실행
ENTRYPOINT ["java", "-jar", "/app.jar", "--spring.config.location=application.yml"]
그런데 다른 예시를 참조해보면 모두 ENTRYPOINT를 java -jar /app.jar로 설정하던데..
왜 나만 application.yml을 지정해줘야 하는걸까? 의문이 생겼다.
그 이유를 챗 GPT에게 물어본 결과..
ENTRYPOINT ["java", "-jar", "/app.jar"]
=> Spring Boot는 기본적으로 클래스패스(classpath)에 있는 application.yml 또는 application.properties 파일을 찾습니다. 이 경우, application.yml이 JAR 파일 내에 포함되어 있어야 합니다. 만약 application.yml을 외부 파일로 설정하려면 --spring.config.location을 명시적으로 지정해야 합니다.
그렇다면 나의 경우 application.yml이 JAR 파일 내에 포함이 안된다는 건데, 정말 그럴까? 확인해봤다.
JAR 파일 내에 application.yml이 포함되어있는지 여부는 다음 명령어로 확인해볼 수 있다.
jar tf gradle/wrapper/gradle-wrapper.jar [21:54:35]
META-INF/LICENSE
META-INF/MANIFEST.MF
org/gradle/cli/CommandLineArgumentException.class
org/gradle/cli/CommandLineOption.class
org/gradle/cli/CommandLineParser$AfterOptions.class
org/gradle/cli/CommandLineParser$BeforeFirstSubCommand.class
org/gradle/cli/CommandLineParser$KnownOptionParserState.class
org/gradle/cli/CommandLineParser$MissingOptionArgState.class
org/gradle/cli/CommandLineParser$OptionAwareParserState.class
org/gradle/cli/CommandLineParser$OptionParserState.class
org/gradle/cli/CommandLineParser$OptionString.class
org/gradle/cli/CommandLineParser$ParserState.class
org/gradle/cli/CommandLineParser$UnknownOptionParserState.class
org/gradle/cli/CommandLineParser.class
org/gradle/cli/ParsedCommandLine.class
org/gradle/cli/ParsedCommandLineOption.class
org/gradle/internal/file/PathTraversalChecker.class
org/gradle/util/internal/WrapperDistributionUrlConverter.class
org/gradle/wrapper/BootstrapMainStarter$1.class
org/gradle/wrapper/Download$DefaultDownloadProgressListener.class
org/gradle/wrapper/Download$ProxyAuthenticator.class
org/gradle/wrapper/Download.class
org/gradle/wrapper/ExclusiveFileAccessManager.class
org/gradle/wrapper/GradleUserHomeLookup.class
org/gradle/wrapper/GradleWrapperMain.class
org/gradle/wrapper/Install$1.class
org/gradle/wrapper/Install$InstallCheck.class
org/gradle/wrapper/Install.class
org/gradle/wrapper/Logger.class
org/gradle/wrapper/PathAssembler.class
org/gradle/wrapper/SystemPropertiesHandler.class
org/gradle/wrapper/WrapperConfiguration.class
org/gradle/wrapper/WrapperExecutor.class
진짜 없었다.
이유가 뭘까? 확인해보니 application.yml 파일은 src/main/resources 폴더에 위치해야 한다고 한다....... ^^
나도 처음엔 해당 위치에 있었는데 환경변수 파일 설정하다보니 루트로 옮겨버렸음..
스프링 초보라서 이런 실수를 했나보다.
IntelliJ는 application.yml가 root 경로에 있어도 잘 인식하던데, 그건 IDE가 똑똑해서 그런거고 docker는 다른것 같다.
결론:
항상 application.yml 파일은 src/main/resources 폴더에 위치시켜야 함
'디버깅' 카테고리의 다른 글
[파이썬]split할 때 ValueError: not enough values to unpack (expected 2, got 1) (0) | 2021.08.03 |
---|---|
yolo Map 측정 디버깅 (0) | 2021.08.03 |