CI / CD ardışık düzen uygulamasında Dockerfile'ı farklı kiracılar için dinamik olarak yönetme


13

Docker, Kubernetes ve Jenkins kullanarak projem için CI / CD boru hattını uygulamaya çalışıyorum. Uygulamam, veritabanı uygulaması değişkenlerinin farklı kiracı için her şeyin farklı olduğu çok kiracılı bir uygulamadır.

Uygulama Stratejisi

Bir docker görüntüsü oluştururken bir Dockerfile kullanıyorum. Dockerfile'ımı SVN kod depomun içinde tutuyorum. Her kiracı için kod deposu aynıdır. Bir görüntü oluştururken, o zaman farklı kiracı için farklı görüntüler oluşturmam gerekiyor.

Dockerfile uygulaması

Docker dosyama aşağıdaki gibi bir giriş noktası ekliyorum,

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=tenant1config" , "TestProject.war"]

Başka bir kiracı için Docker resmi oluşturmam gerekirse,
-Dspring.profiles.active=tenant2config

Dockerfile içindeki giriş noktası dinamiktir.

Karışıklık

  1. Dockerfile içindeki giriş noktası komutunu yönetmek için dinamik olarak mümkün mü?
  2. Veya başka bir kiracı için başka bir Dockerfile eklemem gerekir mi? Ve ayrı kiracı için docker build komutunu ayrı olarak çalıştırmanız mı gerekiyor?

Bu sorunun nasıl uygulanacağının standart bir yolunu nasıl bulabilirim?


3
Bir ortam değişkenini ENTRYPOINTyani sunucunuzda kullanabilirsiniz, ... -Dspring.profiles.active=${TENANT}ardından dağıtımlarınız sırasında doğru ortamı ayarlayabilirsiniz.
masseyb

Yanıtlar:


13

12 Faktörden Alıntı - Yapılandırma

Bir uygulamanın yapılandırması, dağıtımlar (hazırlama, üretim, geliştirici ortamları vb.) Arasında değişmesi muhtemel her şeydir. Bu içerir:

  • Veritabanı, Memcached ve diğer destek hizmetlerine kaynak işlenir

  • Amazon S3 veya Twitter gibi harici hizmetlere ilişkin kimlik bilgileri

  • Dağıtım için standart ana bilgisayar adı gibi dağıtım başına değerler

Sen gerektiğini değil ikili aynı ve herhangi bir çalışma zamanı yapılandırmaları ortamı aracılığıyla enjekte edilmelidir olması gerektiği gibi her kiracı için ayrı liman işçisi görüntüleri kurmak.

Çalışma zamanı yapılandırmasını enjekte etmek için farklı seçenekler vardır

  1. Ortam Değişkenleri

Girdi noktasındaki profili sabit kodlamak yerine bir ortam değişkeni ekleyin

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$TENANT_PROFILE" , "TestProject.war"]

Ardından ortam değişkenini kubernetes dağıtım yapılandırmasından enjekte edin Bkz. Https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

  1. Profil yapılandırmasını bir yapılandırma olarak bağlayın ve bakın

Giriş noktanız şöyle görünecek

ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"] Ardından gerekli yapılandırma dosyasını kubernetes yapılandırması olarak bağlayın.

Her iki şekilde de çalışma zamanı yapılandırmasını docker görüntüsünden dışlayın ve dağıtım yapılandırması aracılığıyla bir ortam değişkeni veya yapılandırma olarak enjekte edin.


1
Ortam değişkeni olarak SPRING_PROFILES_ACTIVE kutunun dışında çalışmalıdır. Java ek parametresine gerek yoktur.
Manuel Polacek

3

Liman işçisi ARGS'den faydalanabilirsiniz, bu sadece derleme zamanında kullanılabilir ve bu giriş noktasında kullanılabilir.

docker build --build-arg CONFIG_FILE=<file_name> -t tag_name .

CONFIG_FILE, yapılandırma dosyasının yerini tutacaktır ve dinamik olarak iletebilirsiniz. Giriş noktanızı ile değiştirin$CONFIG_FILE

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$CONFIG_FILE" , "TestProject.war"]

ARG CONFIG_FILE - Dockerfile içinde bildirilmelidir
Roman M

0

Bakınız - Dockerfile En İyi Uygulamaları

ENTRYPOINT, bir kapsayıcıyı çalışma zamanında bağımsız değişkenler alabilen yürütülebilir bir dosya olarak çalışacak şekilde yapılandırmanıza yardımcı olur

Geçersiz kılmak istediğiniz herhangi bir dinamik özellik, aynı görüntü ile çalışma zamanında yapılabilir.

Çalışma zamanında gerekli argümanı iletebilirsiniz.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.