source

도커에 전개할 때 스프링 부트 속성 외부화

myloves 2023. 4. 3. 21:52

도커에 전개할 때 스프링 부트 속성 외부화

Spring Boot 앱에서 도커 컨테이너에서 실행할 속성을 외부로 내보냅니다. 전개되었을 때 에 my-server/src/main/resources/application.yml응용 프로그램에 의해 로드되어 사용됩니다.이치노

이러한 에 따라 에, 「 」, 「 」, 「 」에 할 가 있는 것이 입니다.application.yml도커 컨테이너에 파일을 보관합니다.이 에서는 이 내용이 .build/docker/하기 buildDocker따라서 첫 번째 배포 후에는 작업이 복사되거나 액세스할 수 없습니다.

저는 Yaml 을 Yaml 파일에 .docker/ directory it to directory(접근 가능한 )/opt/meanwhileinhell/myapp/conf를합니다.spring.config.locationDockerfile Jar:

ENTRYPOINT  ["java",\
...
"-jar", "/app.jar",\
"--spring.config.location=classpath:${configDirectory}"]

도커 컨테이너에서 실행되는 명령어를 보면 예상대로임을 알 수 있습니다.

/app.jar --spring.config.location=classpath:/opt/meanwhileinhell/myapp/conf]

그러나 이 파일의 속성을 업데이트하고 도커 컨테이너를 다시 시작해도 변경 사항이 선택되지 않습니다.파일 권한:

-rw-r--r-- 1 root root  618 Sep  5 13:59 application.yml

문서에는 다음과 같이 기술되어 있습니다.

커스텀 설정 로케이션이 설정되어 있는 경우는, 디폴트의 로케이션과 함께 사용됩니다.사용자 지정 위치는 기본 위치보다 먼저 검색됩니다.

제가 무엇을 잘못하고 있는지 알 수 없는 것 같습니다만, 더 중요한 것은, 이것이 이러한 유형의 도커 시나리오에서 설정을 외부화하는 올바른 방법입니까?

도커 이미지 구성

Spring Boot 파워 도커 컨테이너 출시에 대해 Spring이 권장하는 방법을 살펴보면 다음과 같습니다.

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ARG JAR_FILE
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]

즉, 이미지가 openjdk로 확장되고 컨테이너에 자체 환경이 있습니다.이 경우 환경변수가 yml 파일보다 우선하기 때문에 덮어쓸 속성을 환경속성으로 선언하면 충분합니다.Spring Boot은 이를 가져옵니다.

도커 명령에서도 환경 변수를 전달하여 원하는 구성으로 컨테이너를 시작할 수 있습니다.JVM 메모리의 제한을 설정하는 경우는, 다음의 링크를 참조해 주세요.


도커 구성 샘플

다음은 도커 구성을 사용하여 간단한 앱 환경을 시작하는 예입니다. 저는 시田, the田를 합니다.spring.datasource.url은 환경변수로 에, 이것은 있는 , 환경변수, 환경변수, 환경변수, 환경변수, 환경변수, 환경변수, 환경변수, 환경변수, 환경변수.application.ymlfilename을 클릭합니다.

version: '2'
services:
    myapp:
        image: mycompany/myapp:1.0.0
        container_name: myapp
        depends_on:
        - mysql
        environment:
            - SPRING_DATASOURCE_URL=jdbc:mysql://mysql:3306/myapp?useUnicode=true&characterEncoding=utf8&useSSL=false
        ports:
            - 8080:8080

    mysql:
        image: mysql:5.7.19
        container_name: mysql
        volumes:
            - /home/docker/volumes/myapp/mysql/:/var/lib/mysql/
        environment:
            - MYSQL_USER=root
            - MYSQL_ALLOW_EMPTY_PASSWORD=yes
            - MYSQL_DATABASE=myapp
        command: mysqld --lower_case_table_names=1 --skip-ssl --character_set_server=utf8

다음 항목도 참조하십시오.

개인적으로 다음 두 가지 옵션을 고려하겠습니다.

  1. 구성별 환경 변수 사용

    app:
      image: my-app:latest
      ports:
        - "8080:8080"
      environment:
         SPRING_DATASOURCE_URL=jdbc:mysql://db:3306/table
    
  2. 「」를 사용합니다.SPRING_APPLICATION_JSON

    app:
      image: my-app:latest
      ports:
        - "8080:8080"
      environment:
        SPRING_APPLICATION_JSON: '{
          "spring.datasource.url": "jdbc:mysql://db:3306/table",
        }'
    

개인적으로는 Spring Cloud Config Server를 사용하여 모든 곳에 속성 파일을 셋업할 수 없습니다.

tl;dr을 사용하면 중앙 위치에서 환경/프로파일 레벨별로 git(버전 제어, 분기 등을 가능하게 함)의 속성을 유지할 수 있으며, REST가 이를 제공합니다.Spring Boot은 이를 완전히 지원합니다.실제로 Spring Boot은 고객의 환경에 들어가는 또 다른 속성 소스일 뿐입니다.

https://spring.io/guides/gs/centralized-configuration/

그래서 간신히 작동시켰죠클래스 경로를 DockerFile 디렉토리에 전달하는 대신 다음을 수행합니다.

"--spring.config.location=classpath:${configDirectory}"]

대신 파일의 전체 위치를 전달하려고 했습니다.

 "--spring.config.location=file:${configDirectory}/application.yml"]

이제 Docker 컨테이너를 다시 시작하면 업데이트됩니다.

Xtreme Biker의 답변에 따라 이번에는 스프링 부트 워를 도커라이즈된 TomCat에 도입합니다.

을 권장합니다.application.yml도커 환경 변수를 사용하여 환경별 변경이 필요한 개별 키를 재정의합니다.

이 접근방식을 권장하는 이유는 (Docker 환경변수 사용) 다음과 같습니다.

  • 도커 이미지는 현지 개발에 사용할 수 있는 것과 동일한 아티팩트를 사용할 수 있습니다.
  • 볼륨 트레이닝을 사용하는 것은 괴롭습니다.도커호스트에 살 곳을 찾을 필요가 있습니다.그 때문에, 호스트는 눈송이처럼 변합니다.
  • 도커비밀을사용하는것은고통입니다.파일시스템에서비밀을명시적으로검색하도록이미지또는어플리케이션레이어를변경해야합니다.

Spring Boot의 Externalized Configuration 문서에서는 명령줄에서 환경을 제공하는 두 가지 방법을 설명합니다.

  • vars UN*X env vars (::SPRING_DATASOURCE_USERNAME=helloworld)
  • 옵션 Java 옵션:-Dspring.datasource.username=helloworld)

Java 옵션을 선호하는 이유는 Java 옵션이 "다음 Java 프로세스를 위한 이며 해당 Java 프로세스를 위한 것"이라는 명확한 의도를 나타내기 때문입니다.

마지막으로:톰캣을 쓰고 싶다.CATALINA_OPTS이러한 Java 옵션을 전달하기 위한 메커니즘으로 사용됩니다.서:로부터의:catalina.sh:

(임의) "start", "run" 또는 "debug" 명령어가 실행될 때 사용되는 Java 런타임옵션.JAVA_OPTS에 포함되지 않은 모든 옵션은 Tomcat 자체에서만 사용해야 하며 중지 프로세스, 버전 명령 등에 의해 사용되지 않아야 합니다.예를 들어 히프 사이즈, GC 로깅, JMX 포트 등이 있습니다.

왜냐면CATALINA_OPTSDocker 이미지 작성보다 쉬운 경로입니다.setenv.sh적절한 Docker 환경 선언을 전달하고 있습니다.


구축하다.war다음과 같은 예술품:

./gradlew war

기대는.war그래들에 의해 출력되는 예술품build/libs/api-0.0.1-SNAPSHOT.war.

도커 파일 사용:

FROM tomcat:8.5.16-jre8-alpine

EXPOSE 8080

COPY build/libs/api-0.0.1-SNAPSHOT.war /usr/local/tomcat/webapps/v1.war

CMD ["catalina.sh", "run"]

다음과 같이 도커 이미지를 빌드합니다.

docker build . --tag=my-api

통과하다CATALINA_OPTS컨테이너에 다음과 같이 연결합니다.

docker run -it \
-p 8080:8080 \
-e CATALINA_OPTS="\
-Dspring.datasource.url='jdbc:mysql://mydatabase.stackoverflow.com:3306' \
-Dspring.datasource.username=myuser \
" \
my-api

도커 컴포지트 배리언트는 다음과 같습니다.

version: '3.2'
services:
  web:
    image: my-api
    ports:
      - "8080:8080"
    environment:
      - >
        CATALINA_OPTS=
        -Dspring.datasource.url='jdbc:mysql://mydatabase.stackoverflow.com:3306'
        -Dspring.datasource.username=myuser

이 접근방식은 실행 가능한 솔루션임에 틀림없습니다.다만, 다른 실가동 환경과 개발 환경간에 이미지를 이동할 수 없게 되기 때문에, 추천할 수 없습니다.컨테이너는 불변해야 하며 모든 환경 구성을 외부화해야 합니다.

스프링 부트에는 구성을 외부화할 수 있는 매우 강력한 프로젝트가 있습니다.스프링 클라우드 구성이라고 합니다.컨피규레이션서버를 사용하면, 환경 고유의 설정을 git 저장소에 보존해, 그 설정을 필요로 하는 애플리케이션에 제공할 수 있습니다.기본적으로 동일한 application.yml을 git에 저장하고 구성 서버를 저장소 위치로 지정하기만 하면 됩니다.

이 방법에 따라 다양한 환경에 대해 여러 구성 파일을 정의하고 도커 컨테이너를 불변 상태로 유지할 수 있습니다.

언급URL : https://stackoverflow.com/questions/46057625/externalising-spring-boot-properties-when-deploying-to-docker