docker-compose에 외부 파일 연동시 발생 문제

임현규·2023년 3월 7일
0
post-thumbnail

컨테이너로 실행한 app에 application.yml 추가하기

java app image를 만들때 환경 변수 옵션으로 로케이션을 설정할 수 있도록 했다.

내가 java image로 빌드하기 위해 짠 Dockerfile은 다음과 같다.

FROM openjdk:11-jdk-slim

WORKDIR /app

COPY build/libs/meca-0.0.1-SNAPSHOT.jar app.jar

ENV SERVER_MODE default
ENV PORT 8000
ENV LOCATION "/"

ENTRYPOINT ["java","-Dserver.port=${PORT}","-Dspring.profiles.active=${SERVER_MODE}", "-jar", "app.jar", "--spring.config.location=${LOCATION}"]

위의 ENV를 주목해보면 LOCATION이 있는데 이는 빌드된 image의 jar 파일 실행시 --spring.config.location 옵션에 들어갈 경로가 되는 변수이다. 이를 통해 외부 application.yml에 접근할 수 있다.

개발 서버에서 의도된대로 동작 X

개발 서버에서 application.yml을 github에 노출되기 꺼리기 때문에 직접 넣어서 사용하기로 했다. 그 때 작성한 docker-compose.yml의 일부는 다음과 같다.

services:
  java-api-server:
    image: image~~
    ports:
      - "8080:8080"
    environment:
      PORT: 8080
      LOCATION: /app/application.yml
    depends_on:
      - sql-db

실행했더니 다음과 같은 오류를 마주쳤다.

ubuntu-java-api-server-1  | 02:20:20.743 [main] DEBUG org.springframework.boot.diagnostics.LoggingFailureAnalysisReporter - Application failed to start due to an exception
ubuntu-java-api-server-1  | org.springframework.boot.context.config.ConfigDataResourceNotFoundException: Config data resource 'file [/app/application.yml]' via location '/app/application.yml' cannot be found

/app/application.yml 경로에 application.yml을 찾을 수 없다는 것이다. 왜 이런 일이 일어났을까?

문제 파악하기

Docker는 기본적으로 build된 이미지를 독립된 공간의 컨테이너에서 실행한다. 이 때 build된 이미지 경로대로 컨테이너에서는 앱을 실행하기 때문에 외부 저장 공간을 인식 할 수 없다. 외부 저장 공간을 인식하려면???

답은 바인드 마운트

정답은 바인드 마운트를 활용하는 것이다. 사실 바인드 마운트는 어느정도 알고 있었지만 ENV에도 설마 적용되나 싶었다. 환경변수도 마찬가지다. 환경변수을 ENTRYPOINT에서 실행 옵션으로 주는데 이것 마저 컨테이너에서 실행되기 때문이다. 그렇다면 우리의 Location을 인식하기 위해서는 application.yml을 볼륨을 활용해 바인드 마운트해주고 해당 경로를 컨테이너 내부 경로와 매핑해서 그 경로를 제공해주면 된다.

services:
  java-api-server:
    image: image~~
    ports:
      - "8080:8080"
    environment:
      PORT: 8080
      LOCATION: /app/application.yml
    volumes:
      /home/usr/config/application.yml:/app/application.yml
    depends_on:
      - sql-db
profile
엘 프사이 콩그루

0개의 댓글