การจัดการ Dockerfile แบบไดนามิกสำหรับผู้เช่าที่แตกต่างกันในการใช้งานไปป์ไลน์ CI / CD


13

ฉันกำลังพยายามใช้ CI / CD ไปป์ไลน์สำหรับโครงการของฉันโดยใช้ Docker, Kubernetes และ Jenkins แอปพลิเคชันของฉันเป็นแอปพลิเคชันหลายผู้เช่าที่แอปพลิเคชันฐานข้อมูลตัวแปรทุกอย่างแตกต่างกันสำหรับผู้เช่ารายอื่น

แอพลิเคชันกลยุทธ์

เมื่อฉันสร้างภาพนักเทียบท่าฉันกำลังใช้ Dockerfile และฉันเก็บ Dockerfile ไว้ในที่เก็บรหัส SVN ของฉัน สำหรับผู้เช่าทุกคนที่เก็บรหัสจะเหมือนกัน เมื่อฉันสร้างภาพในเวลานั้นฉันต้องสร้างภาพที่แตกต่างกันสำหรับผู้เช่าที่แตกต่างกัน

การใช้งาน Dockerfile

ในไฟล์นักเทียบท่าของฉันฉันกำลังเพิ่มจุดเข้าใช้งานดังนี้:

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

หากฉันต้องการสร้างภาพนักเทียบท่าสำหรับผู้เช่ารายอื่นต้องเพิ่ม
-Dspring.profiles.active=tenant2config

ดังนั้นจุดเข้าใช้งานใน Dockerfile จึงเป็นแบบไดนามิก

ความสับสนของฉัน

  1. สำหรับการจัดการคำสั่ง entry point ภายใน Dockerfile เป็นไปได้ไหม?
  2. หรือฉันจำเป็นต้องเพิ่ม Dockerfile อื่นสำหรับผู้เช่ารายอื่นหรือไม่? และจำเป็นต้องเรียกใช้คำสั่งสร้างนักเทียบท่าแยกต่างหากสำหรับผู้เช่าแยกกันหรือไม่

ฉันจะหาวิธีมาตรฐานที่ดีในการนำปัญหานี้ไปใช้อย่างไร


3
คุณสามารถใช้ตัวแปรสภาพแวดล้อมในENTRYPOINTie ของคุณ... -Dspring.profiles.active=${TENANT}จากนั้นตั้งค่าสภาพแวดล้อมที่ถูกต้องในระหว่างการปรับใช้ของคุณ
masseyb

คำตอบ:


13

การอ้างอิงจาก12 Factor - การกำหนดค่า

การกำหนดค่าของแอปคือทุกสิ่งที่อาจแตกต่างกันระหว่างการปรับใช้ (การจัดเตรียมการผลิตสภาพแวดล้อมสำหรับนักพัฒนาและอื่น ๆ ) รวมถึง:

  • จัดการกับฐานข้อมูล Memcached และบริการสำรองอื่น ๆ

  • สิทธิในการใช้บริการภายนอกเช่น Amazon S3 หรือ Twitter

  • ค่าต่อการปรับใช้เช่นชื่อโฮสต์บัญญัติสำหรับการปรับใช้

คุณไม่ควรสร้างอิมเมจนักเทียบท่าแยกต่างหากสำหรับผู้เช่าแต่ละรายเนื่องจากไบนารีควรเหมือนกันและการกำหนดค่ารันไทม์ใด ๆ ควรถูกฉีดผ่านสภาพแวดล้อม

มีตัวเลือกต่าง ๆ ในการฉีดการกำหนดค่ารันไทม์

  1. ตัวแปรสภาพแวดล้อม

แทน hardcoding โปรไฟล์ใน entrypoint ให้เพิ่มตัวแปรสภาวะแวดล้อม

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

จากนั้นฉีดตัวแปรสภาพแวดล้อมจากคอนฟิกูเรชันการปรับใช้ kubernetes อ้างอิงhttps://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

  1. เมานต์กำหนดค่าโปรไฟล์เป็นกำหนดค่าและอ้างอิง

จุดเข้าของคุณจะมีลักษณะ

ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"] จากนั้นทำการเมานท์ไฟล์ปรับแต่งที่จำเป็นเพื่อทำการปรับแต่ง kubernetes

วิธีการกำหนดค่ารันไทม์ภายนอกจากอิมเมจ docker และส่งผ่านการกำหนดค่าการปรับใช้เป็นตัวแปรสภาพแวดล้อมหรือการกำหนดค่า


1
SPRING_PROFILES_ACTIVE เนื่องจากตัวแปรสภาพแวดล้อมควรทำงานนอกกรอบ ไม่จำเป็นต้องใช้พารามิเตอร์เพิ่มเติมของจาวา
Manuel Polacek

3

คุณสามารถใช้ประโยชน์จากนักเทียบท่า ARGS ซึ่งจะใช้ได้เฉพาะเวลา build เท่านั้นและสามารถใช้ที่ entrypoint

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"]

ARG CONFIG_FILE - ควรประกาศไว้ใน Dockerfile
Roman M

0

อ้างอิง - แนวทางปฏิบัติที่ดีที่สุดของ Dockerfile

ENTRYPOINT ช่วยให้คุณสามารถกำหนดค่าคอนเทนเนอร์เพื่อให้ทำงานได้ซึ่งสามารถเรียกใช้อาร์กิวเมนต์ได้ที่รันไทม์

คุณสมบัติแบบไดนามิกใด ๆ ที่คุณต้องการแทนที่สามารถทำได้ในขณะทำงานด้วยภาพเดียวกัน

คุณสามารถส่งผ่านอาร์กิวเมนต์ที่จำเป็นได้ที่รันไทม์

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.