Quản lý Dockerfile một cách linh hoạt cho những người thuê khác nhau trong việc triển khai đường ống CI / CD


13

Tôi đang cố gắng thực hiện đường ống CI / CD cho dự án của mình bằng Docker, Kubernetes và Jenkins. Ứng dụng của tôi là ứng dụng nhiều người thuê trong đó ứng dụng cơ sở dữ liệu biến mọi thứ khác nhau đối với người thuê khác nhau.

Chiến lược ứng dụng

Khi tôi đang xây dựng hình ảnh docker Tôi đang sử dụng Dockerfile. Và tôi giữ Dockerfile của mình bên trong kho mã SVN của mình. Đối với mỗi người thuê, kho lưu trữ mã là như nhau. Khi tôi đang xây dựng một hình ảnh, tại thời điểm đó tôi cần xây dựng các hình ảnh khác nhau cho những người thuê nhà khác nhau.

Thực hiện Dockerfile

Trong tệp docker của tôi, tôi đang thêm điểm vào như sau,

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

Nếu tôi cần xây dựng hình ảnh Docker cho người thuê khác, cần thêm
-Dspring.profiles.active=tenant2config

Vì vậy, điểm vào trong Dockerfile là động.

Sự nhầm lẫn của tôi

  1. Để quản lý lệnh nhập điểm bên trong Dockerfile có thể bằng động?
  2. Hoặc tôi có cần thêm Dockerfile cho người thuê khác không? Và cần chạy lệnh xây dựng docker riêng cho người thuê riêng?

Làm thế nào tôi có thể tìm thấy một cách tiêu chuẩn tốt để thực hiện vấn đề này?


3
Bạn có thể sử dụng một biến môi trường trong ENTRYPOINTtức là ... -Dspring.profiles.active=${TENANT}sau đó đặt môi trường chính xác trong quá trình triển khai của bạn.
masseyb

Câu trả lời:


13

Trích dẫn từ 12 yếu tố - Cấu hình

Cấu hình của ứng dụng là mọi thứ có khả năng thay đổi giữa các lần triển khai (dàn dựng, sản xuất, môi trường nhà phát triển, v.v.). Điêu nay bao gôm:

  • Tài nguyên xử lý cơ sở dữ liệu, Memcached và các dịch vụ sao lưu khác

  • Thông tin xác thực cho các dịch vụ bên ngoài như Amazon S3 hoặc Twitter

  • Các giá trị mỗi lần triển khai như tên máy chủ chính tắc để triển khai

Bạn không nên xây dựng hình ảnh docker riêng cho từng đối tượng thuê vì nhị phân phải giống nhau và mọi cấu hình thời gian chạy nên được đưa vào trong môi trường.

Có các tùy chọn khác nhau để tiêm cấu hình thời gian chạy

  1. Biến môi trường

Thay vì mã hóa hồ sơ trong điểm vào, thêm một biến môi trường

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

Sau đó, nhập biến môi trường từ cấu hình triển khai kubernetes Tham khảo https://kubernetes.io/docs/t task / document-data-application / define-en môi-variable-content /

  1. Gắn cấu hình cấu hình như một cấu hình và tham chiếu nó

Điểm vào của bạn sẽ giống như

ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"] Sau đó gắn tập tin cấu hình cần thiết dưới dạng cấu hình kubernetes.

Cả hai cách bên ngoài cấu hình thời gian chạy từ hình ảnh docker và đưa nó thông qua cấu hình triển khai như một biến môi trường hoặc một cấu hình.


1
SPRING_PROFILES_ACTIVE là biến môi trường sẽ hoạt động tốt. Không cần tham số bổ sung java.
Manuel Polacek

3

Bạn có thể sử dụng ARGS docker, điều này sẽ chỉ có sẵn tại thời điểm xây dựng và điều này có thể được sử dụng tại điểm vào.

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

CONFIG_FILE sẽ giữ vị trí của tệp cấu hình và bạn có thể chuyển nó một cách linh hoạt. Thay thế điểm vào của bạn bằng$CONFIG_FILE

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

ARG CONFIG_FILE - nên được khai báo bên trong Dockerfile
Roman M

0

Tham khảo - Thực hành tốt nhất Dockerfile

ENTRYPOINT giúp bạn định cấu hình vùng chứa để chạy dưới dạng thực thi có thể nhận đối số khi chạy

Bất kỳ thuộc tính động nào bạn muốn ghi đè, có thể được thực hiện trong thời gian chạy với cùng một hình ảnh.

Bạn có thể vượt qua đối số cần thiết trong thời gian chạy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.