18.4.레거시 애플리케이션에 설정 전략 적용하기

  • 레거시 애플리케이션에은 환경 변수나 설정 파일 병합을 통한 설정 구성은 일반적으로 지원하지 않는다.
  • 윈도 환경의 닷넷 애플리케이션이 그 좋은 예다.
  • 하지만 Dockerfile 스크립트를 잘 이용하면 이들 애플리케이션에도 우리가 앞서 배운 설정 전략을 적용할 수 있다.
  • 컨테이너에 주입된 설정 파일을 애플리케이션의 설정 전략에 맞춰 변환하는 유틸리티 또는 스크립트를 이미지에 포함시키는 방법이다.

  • 컨테이너에 지정된 오버라이드 설정 파일을 읽어 들이기

  • 환경 변수에서 오버라이드 설정을 읽어 들이기
  • 오버라이드 설정 파일과 환경 변수 설정을 병합하기. 이때, 환경 변수 값이 우선한다.
  • 병합된 오버라이드 설정을 컨테이너 내 대상 설정 파일에 추가한다.

실습 '레거시' 애플리케이션을 기본 설정과 오버라이드 설정 파일을 적용해 각각 실행하라.

  • 애플리케이션을 시작할 때 미리 설정을 준비해 주는 유틸리티가 있기 때문에 내부 설정 메커니즘이 다르더라도 앞서 본 설정 전략과 같은 방식의 설정을 그대로 사용할 수 있다.
001)  cd ch18/exercises/image-of-the-day
002) 
003) # 기본 설정으로 실행
004)  docker container run -dp 8089:80 diamol/ch18-image-of-the-day
005) 
006) # 바인드 마운트로 주입된 오버라이드 설정 파일을 적용해 실행
007)  docker container run -dp 8090:80 \
008)   -v "$(pwd)/config/dev:/config-override" \
009)   -e CONFIG_SOURCE_PATH="/config-override/application.properties" \
010)   diamol/ch18-image-of-the-day
011) 
012) # 설정 파일의 내용을 확인
013)  curl http://localhost:8089/config
014) {"release":"19.12","environment":"UNKNOWN","managementEndpoints":"health,info,prometheus","apodUrl":"https://api.nasa.gov/planetary/apod?api_key="}
015) 
016)  curl http://localhost:8090/config
017) {"release":"19.12","environment":"DEV","managementEndpoints":"health","apodUrl":"https://api.nasa.gov/planetary/apod?api_key="}
  1. 009: 바인드 마운트로 주입된 오버라이드 설정 파일을 적용한다. 오버라이드 설정 파일의 경로는 환경 변수를 통해 정의된다.

  2. 애플리케이션과 함께 빌드되는 유틸리티가 레거시 설정 모델에 맞춰 설정 파일을 변환해 준다.

  3. 환경별 오버라이드 파일이 들어 있는 디렉터리(컨피그 객체나 비밀값도 가능하다)를 바인드 마운트시키고, 추가로 오버라이드 파일 경로를 시작 유틸리티가 참조하는 환경 변수에 지정하면 된다.

예제 18-2 설정 변환 유틸리티의 빌드 및 실행 스크립트

FROM diamol/maven AS builder

# ...
RUN mvn package

# 설정변환 유틸리티
FROM diamol/maven as utility-builder

WORKDIR /usr/src/utilities
COPY ./src/utilities/ConfigLoader.java .
RUN javac ConfigLoader.java

# 애플리케이션
FROM diamol/openjdk

EXPOSE 80
ENV CONFIG_SOURCE_PATH="" \
    CONFIG_TARGET_PATH="/app/config/application.properties"

CMD java ConfigLoader && \
    java -jar /app/iotd-service-0.1.0.jar

WORKDIR /app/config
WORKDIR /app
COPY --from=utility-builder /usr/src/utilities/ConfigLoader.class .
COPY --from=builder /usr/src/iotd/target/iotd-service-0.1.0.jar .
  • 애플리케이션 시작 로직을 수정해 실제 애플리케이션이 실행되기 전에 원하는 작업을 수행할 수 있다.
  • 이 작업으로 인해 컨테이너 시작과 애플리케이션 실행 사이에 시간 간격이 생긴다.
  • 시작 로직에 오류가 있는 경우 컨테이너가 실패할 수도 있기 때문에 이에 대처할 수 있도록 항상 헬스 체크를 적용해야 한다.

실습 레거시 애플리케이션은 환경 변수를 설정에 사용하지 않지만, 설정 유틸리티가 환경 변수를 읽어 설정 파일로 변환해 주므로 현대적인 애플리케이션과 동일한 사용자 경험을 가질 수 있다.

  • 설정 유틸리티는 환경 변수가 설정 파일을 오버라이드하도록 돼 있다.
  • 오버라이드 설정 파일과 환경 변수에 정의된 설정을 병합해 애플리케이션에 정의된 경로에 설정 파일을 만든다.
001) # 오버라이드 설정 파일과 환경 변수 설정을 적용해 컨테이너 실행
002)  docker run -d -p 8091:80 \
003)   -v "$(pwd)/config/dev:/config-override" \
004)   -e CONFIG_SOURCE_PATH="/config-override/application.properties" \
005)   -e IOTD_ENVIRONMENT="custom" \
006)   diamol/ch18-image-of-the-day
007) 
008) # 설정 내용 확인
009)  curl http://localhost:8091/config
010) {"release":"19.12","environment":"custom","managementEndpoints":"health","apodUrl":"https://api.nasa.gov/planetary/apod?api_key="}
  1. 002~006: 애플리케이션을 시작하기 전에 설정 모델 변환 유틸리티를 먼저 실행한다. 환경 변수를 설정에 추가하려면 변수명에 접두사 IOTD를 붙여야 한다.
  2. 008: 이 설정은 기본 설정 파일, 오버라이드 설정 파일, 환경 변수를 병합해 구성한 것이다. 앞서 본 Node.js, 닷넷 코어, Go 애플리케이션과 같다.

예제 18-3 컴포즈 파일의 설정 관련 부분 * 실제 설정 방법은 애플리케이션마다 다를 수 있으며, 이를 문서화를 통해 이러한 혼선을 줄일 수 있다. * 애플리케이션 매니페스트가 이러한 문서 역할을 가장 잘 수행할 수 있다.

version: "3.7"

services:
  accesslog:
    image: diamol/ch18-access-log
    ports:
      - "8030:80"
    environment:
      NODE_CONFIG: '{"metrics": {"enabled":"true"}}'
    secrets:
      - source: access-log-config
        target: /app/config-override/local.json
    networks:
      - iotd-net

  iotd:
    image: diamol/ch18-image-of-the-day
    ports:
      - "8020:80"
    environment:
      CONFIG_SOURCE_PATH: "/config-override/application.properties"
      IOTD_MANAGEMENT_ENDPOINTS_WEB_EXPOSURE_INCLUDE: "health,prometheus"
    secrets:
      - source: iotd-config
        target: /config-override/application.properties
    networks:
      - iotd-net

  image-gallery:
    image: diamol/ch18-image-gallery
    ports:
      - "8010:80"
    environment:
      IG_METRICS.ENABLED: "TRUE"
    secrets:
      - source: image-gallery-config
        target: /app/config-override/config.toml
    depends_on:
      - accesslog
      - iotd
    networks:
      - iotd-net

networks:
  iotd-net:

secrets:
  access-log-config:
    file: access-log/config/dev/local.json
  iotd-config:
    file: image-of-the-day/config/dev/application.properties
  image-gallery-config:
    file: image-gallery/config/dev/config.toml
  • Node.js 애플리케이션은 환경 변수의 값에 JSON 문자열을 지정해 프로메테우스 정보 수집을 활성화하며, 오버라이드 설정 파일의 내용도 JSON 포맷으로 돼 있다.
  • Java 애플리케이션은 환경 변수를 사용해 관리용 API에 노출시킬 정보를 지정하고(프로메테우스로 수집한 정보도 포함시켰다), 키-값 쌍으로 구성된 오버라이드 설정 파일을 불러왔다
  • Go 애플리케이션은 간단히 환경 변수 값을 TRUE로 지정해 프로메테우스 정보 수집을 활성화했고, 오버라이드 설정 파일은 TOML 포맷 파일이다.
  • 설정 파일은 비밀값 형태로 전달되지만, 기본적으로 볼륨 마운트나 클러스터에 저장된 컨피그 객체를 사용하는 것과 차이가 없다.
  • 사용자 경험 면에서는 장점과 단점이 모두 존재한다.
  • 장점은 오버라이드 설정 파일의 경로만 변경해 쉽게 환경별 설정을 바꿀 수 있다는 점이
  • 단점은 애플리케이션 각각의 특이 사항을 기억해야 한다는 점이다.

실습 정해진 설정 사항만으로 애플리케이션 전체 구성 요소를 모두 실행해 보자. 먼저 실행 중인 컨테이너를 모두 제거한 다음 도커 컴포즈를 이용해 애플리케이션을 실행 한다.

001)  cd ch18/exercises
002) 
003) # 현재 설정대로 전체 애플리케이션 실행
004)   exercises git:(main) docker-compose up -d
005) [+] Running 4/4
006)   Network exercises_iotd-net           Created                                                                0.0s 
007)   Container exercises-iotd-1           Started                                                                0.5s 
008)   Container exercises-accesslog-1      Started                                                                0.5s 
009)   Container exercises-image-gallery-1  Started 
010) 
011) # 설정 API로 설정 내용 확인
012) curl http://localhost:8030/config
013) {"release":"19.12","environment":"DEV","metricsEnabled":"true"}%                                                    
014) 
015) curl http://localhost:8020/config
016) {"release":"19.12","environment":"DEV","managementEndpoints":"health,prometheus","apodUrl":"https://api.nasa.gov/planetary/apod?api_key="}
017) 
018) curl http://localhost:8010/config
019) {"Release":"19.12","Environment":"DEV","Metrics":{"Enabled":true},"Apis":{"access":{"Url":"http://accesslog/access-log"},"image":{"Url":"http://iotd/image"}}}
  1. 004: 애플리케이션의 모든 구성 요소를 개발 환경 모드로 설정하고, 환경 변수 값으로 프로메테우스 정보 수집을 활성화했다.
  2. 012~019: 각 구성 요소의 설정 내용, 릴리스 주기 정보는 기본 설정 파일, 환경 이름은 개발 환경용 오버라이드 설정 파일, 정보 수집 여부는 환경 변수로 설정된 것이다.

links

social