Trong quá trình phát triển và triển khai ứng dụng, việc quản lý các biến môi trường (environment variables) là một vấn đề quan trọng. Biến môi trường cho phép bạn tùy chỉnh cấu hình của ứng dụng mà không cần phải thay đổi mã nguồn, đồng thời giữ cho ứng dụng của bạn an toàn hơn bằng cách không lưu trữ thông tin nhạy cảm trực tiếp trong mã nguồn. Khi làm việc với Spring Boot và Docker, sử dụng file env (environment file) là một cách tiếp cận phổ biến và hiệu quả để quản lý các biến môi trường. Trong bài viết này, chúng ta sẽ tìm hiểu cách sử dụng file env cho dự án Spring Boot với Docker, giúp bạn dễ dàng quản lý và triển khai ứng dụng của mình.
1.Giới thiệu về sử dụng file env trong ứng dụng Spring Boot
Trong quá trình phát triển ứng dụng, việc tách biệt cấu hình ứng dụng ra khỏi mã nguồn là một thực hành tốt giúp dễ dàng quản lý và thay đổi cấu hình cho các môi trường khác nhau (development, staging, production). Điều này đặc biệt quan trọng khi triển khai ứng dụng trên các môi trường có cấu hình khác nhau, ví dụ như cơ sở dữ liệu, địa chỉ máy chủ, thông tin xác thực, v.v.
Trong Spring Boot, chúng ta có thể sử dụng file env (environment file) để quản lý các biến môi trường cho ứng dụng một cách dễ dàng và linh hoạt. File env cho phép chúng ta định nghĩa các biến môi trường và giá trị tương ứng, sau đó ứng dụng Spring Boot sẽ đọc và sử dụng các giá trị này để cấu hình cho phù hợp với môi trường triển khai.
2.Hướng dẫn cấu hình và sử dụng file env trong ứng dụng Spring Boot triển khai trên Docker
Trong phần này, chúng ta sẽ xem xét một ví dụ cụ thể về cách sử dụng file env để cấu hình và triển khai một ứng dụng Spring Boot trên Docker.
2.1.Cấu trúc dự án mẫu
Chúng ta có một dự án Spring Boot đơn giản với cấu trúc như sau:
application.yaml: File cấu hình chính của ứng dụng Spring Boot, sử dụng các biến môi trường để cấu hình kết nối cơ sở dữ liệu.
.env: File chứa các biến môi trường chung cho ứng dụng.
.env.dev: File chứa các biến môi trường cho môi trường phát triển (development).
.env.prod: File chứa các biến môi trường cho môi trường production (production)
Dockerfile: File định nghĩa cách build image Docker cho ứng dụng.
docker-compose.yaml: File định nghĩa cách triển khai ứng dụng trên Docker sử dụng Docker Compose.
2.2.Cấu hình biến môi trường trong application.yaml
Trong file application.yaml, chúng ta có thể sử dụng cú pháp ${BIEN_MOI_TRUONG} để tham chiếu đến các biến môi trường. Ví dụ:
server: port: ${PORT:8080} spring: datasource: url: ${MYSQL_URL} username: ${MYSQL_USER} password: ${MYSQL_PASS}
2.3.Quản lý biến môi trường trong file .env
Các biến môi trường chung cho ứng dụng được định nghĩa trong file .env. Ví dụ:
NAME=ENV_DEMO
PORT=8011
Các biến môi trường cho môi trường phát triển (dev) và môi trường production (prod) được định nghĩa trong các file .env.dev và .env.prod tương ứng. Ví dụ:
# .env.dev
DB_URL=jdbc:postgresql://10.147.19.178:5432/postgres
DB_USER=postgres
DB_PASS=123456789
# .env.prod
DB_URL=jdbc:postgresql://10.147.19.40:5432/env_dev
DB_USER=meomeo
DB_PASS=meocoder@1001
2.4.Cấu hình Dockerfile và docker-compose.yaml
File Dockerfile định nghĩa cách build image Docker cho ứng dụng Spring Boot:
FROM eclipse-temurin:17-jre-alpine
LABEL author="Nguyen"
COPY ./target/*.jar ./app.jar
ENV TZ=Asia/Ho_Chi_Minh
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
ENTRYPOINT ["java", "-jar", "./app.jar"]
File docker-compose.yaml định nghĩa cách triển khai ứng dụng trên Docker, bao gồm cấu hình volume, port mapping, và sử dụng các file env:
version: '3.7'
services: app: container_name: env_demo build: . volumes: - /home/web/log:/log ports: - ${PORT}:${PORT} env_file: - .env - .env.dev
2.5.Xây dựng và chạy ứng dụng với Docker Compose
Sau khi cấu hình xong, chúng ta có thể build file jar của ứng dụng bằng lệnh mvn clean install, sau đó chạy lệnh docker-compose up -d để build image Docker và khởi chạy container.
2.6.Kiểm tra kết quả
Khi container khởi chạy, chúng ta có thể kiểm tra log để xem ứng dụng đang chạy với cấu hình nào bằng cách sử dụng lệnh docker logs <container_name>. Ví dụ, nếu ứng dụng được triển khai với môi trường phát triển (dev), log sẽ hiển thị rằng ứng dụng đang chạy trên cổng 8011:
Như vậy, bằng cách sử dụng file env, chúng ta có thể dễ dàng quản lý và thay đổi cấu hình cho các môi trường khác nhau, đồng thời đảm bảo tính bảo mật và tách biệt cấu hình với mã nguồn của ứng dụng.
Để hiểu rõ hơn về cách triển khai thực tế, bạn có thể tham khảo repo mẫu https://github.com/nguyenvh2k/env_demo. Trong repo này, tôi đã cung cấp một ví dụ đầy đủ về cách sử dụng file env để cấu hình và triển khai một ứng dụng Spring Boot trên Docker. Bạn có thể tự mình thử nghiệm và chạy ứng dụng mẫu để hiểu sâu hơn về quy trình làm việc với file env trong môi trường thực tế.