Docker, Kubernetes 및 Jenkins를 사용하여 프로젝트에 CI / CD 파이프 라인을 구현하려고합니다. 내 응용 프로그램은 데이터베이스 응용 프로그램의 변수가 모든 테넌트마다 다릅니다.
응용 전략
도커 이미지를 만들 때 Dockerfile을 사용하고 있습니다. 그리고 Dockerfile을 SVN 코드 저장소에 보관합니다. 모든 테넌트마다 코드 리포지토리가 동일합니다. 이미지를 빌드 할 때 다른 테넌트에 대해 다른 이미지를 빌드해야합니다.
Dockerfile 구현
내 docker 파일에서 다음과 같은 진입 점을 추가하고 있습니다.
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=tenant1config" , "TestProject.war"]
다른 테넌트에 대한 Docker 이미지를 빌드 해야하는 경우 추가해야합니다.
-Dspring.profiles.active=tenant2config
따라서 Dockerfile의 진입 점은 동적입니다.
내 혼란
- Dockerfile 내에서 진입 점 명령을 관리하기 위해 동적으로 가능합니까?
- 또는 다른 테넌트에 다른 Dockerfile을 추가해야합니까? 별도의 테넌트에 대해 docker build 명령을 별도로 실행해야합니까?
이 문제에 대한 좋은 표준 구현 방법을 어떻게 찾을 수 있습니까?
답변
앱 구성은 배포 (스테이징, 프로덕션, 개발자 환경 등)에 따라 달라질 수있는 모든 것입니다. 여기에는 다음이 포함됩니다.
데이터베이스, Memcached 및 기타 지원 서비스에 대한 리소스 핸들
Amazon S3 또는 Twitter와 같은 외부 서비스에 대한 자격 증명
배포의 정식 호스트 이름과 같은 배포 별 값
당신은해야 하지 바이너리가 동일한 및 런타임 구성이 환경을 통해 주입해야이어야한다 각 세입자에 대해 별도의 고정 표시기 이미지를 구축 할 수 있습니다.
런타임 구성을 주입하는 다른 옵션이 있습니다
- 환경 변수
진입 점에서 프로파일을 하드 코딩하는 대신 환경 변수를 추가하십시오.
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$TENANT_PROFILE" , "TestProject.war"]
그런 다음 kubernetes 배포 구성에서 환경 변수를 주입하십시오. https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/를 참조 하십시오.
- 프로파일 구성을 구성으로 마운트하고 참조하십시오.
진입 점은 다음과 같습니다
ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"]
그런 다음 필요한 구성 파일을 kubernetes 구성으로 마운트하십시오.
도커 이미지에서 런타임 구성을 외부화하고 배치 구성을 통해 환경 변수 또는 구성으로 삽입하십시오.
답변
docker ARGS를 사용할 수 있습니다. 빌드 시간에만 사용할 수 있으며 진입 점에서 사용할 수 있습니다.
docker build --build-arg CONFIG_FILE=<file_name> -t tag_name .
CONFIG_FILE은 설정 파일의 위치를 유지하며 동적으로 전달할 수 있습니다. 진입 점을$CONFIG_FILE
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$CONFIG_FILE" , "TestProject.war"]
답변
ENTRYPOINT는 런타임에 인수를 취할 수있는 실행 파일로 실행되도록 컨테이너를 구성하는 데 도움이됩니다.
재정의하려는 모든 동적 속성은 런타임에 동일한 이미지로 수행 할 수 있습니다.
런타임에 필요한 인수를 전달할 수 있습니다.