docker-compose - 外部化 spring application.properties

Posted

技术标签:

【中文标题】docker-compose - 外部化 spring application.properties【英文标题】:docker-compose - externalize spring application.properties 【发布时间】:2017-10-22 21:09:34 【问题描述】:

我有一个连接到 mongo db 并使用 docker 部署应用程序的 spring boot 应用程序。我正在使用这个 docker-compose.yml 文件,它工作正常:

version: '2'
services:
  db:
      container_name: app-db
      image: mongo
      volumes:
        - /data/db:/data/db
      ports:
        - 27017:27017
  web:
    container_name: spring-app
    image: spring-app
    depends_on:
      - db
    environment:
      SPRING_DATA_MONGODB_URI: mongodb://db:27017/appDB
      SPRING_DATA_MONGODB_HOST: db
    ports:
      - 8080:8080

目前,该应用程序正在使用嵌入在 spring 应用程序 docker 映像 (spring-app) 中的 application.properties 文件。如何使用 docker-compose 外部化/传入 application.properties 文件?

感谢您的帮助

【问题讨论】:

只需在environment 部分中指定它们即可。这些优先于application.properties 中定义的那些。 【参考方案1】:

您必须使用 Spring Profiles 来根据您的要求定义环境变量。

server:
    port: 9000
---

spring:
    profiles: development
server:
    port: 9001

---

spring:
    profiles: production
server:
    port: 0

参考:https://docs.spring.io/spring-boot/docs/current/reference/html/howto-properties-and-configuration.html#howto-change-configuration-depending-on-the-environment

您可以定义在运行时需要拾取的配置文件。

version: '2'
services:
  db:
      container_name: app-db
      image: mongo
      volumes:
        - /data/db:/data/db
      ports:
        - 27017:27017
  web:
    container_name: spring-app
    image: spring-app
    depends_on:
      - db
    environment:
      SPRING_DATA_MONGODB_URI: mongodb://db:27017/appDB
      SPRING_DATA_MONGODB_HOST: db
      SPRING_PROFILES_ACTIVE=development
    ports:
      - 8080:8080

但是,如果配置发生不理想的更改,这将需要您重建 docker 映像。 Spring Cloud Config (Vault) 派上用场了,它可以帮助您将配置外部化。

http://cloud.spring.io/spring-cloud-static/spring-cloud-config/1.3.0.RELEASE/

【讨论】:

【参考方案2】:

我不确定我是否会回答这个问题,实际上如果我理解的话。但是,我的 2 美分:

Docker 撰写:

version: "3.4"

x-common-variables:
  &db-env-vars
    POSTGRES_DB: anime
    POSTGRES_USER: root
    POSTGRES_PASSWORD: root
    PORT_API: 8383

volumes:
  webflux_data:

networks:
  webflux_rede:

services:
  db-compose:
    container_name: db-postgres
    image: postgres:9.5-alpine
    hostname: postgres # postgres hostname
    restart: always
    ports:
      - 5432:5432
    volumes:
      - webflux_data:/var/lib/postgresql/data
    networks:
      - webflux_rede
    environment:
      *db-env-vars

web-api:
    image: pauloportfolio/web-api
    build:
      context: ./
      dockerfile: ./dev-dockerfile
      args:
        JAR_FILE: target/spring-webflux-essentials-0.0.1-SNAPSHOT.jar
    ports:
      - 8383:8383
      - 5005:5005
    volumes:
      - webflux_data:/var/lib/postgresql/data
    depends_on:
      - db-compose
    networks:
      - webflux_rede
    environment:
      DB_URL: r2dbc:pool:postgresql://db-compose:$PORT_DB/$POSTGRES_DB
      <<: *db-env-vars
      PROFILE: dev
      DEBUG_OPTIONS: -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 -Xmx1G -Xms128m -XX:MaxMetaspaceSize=128m
      

我的应用程序-dev.properties

server.port=$PORT_API

# DB-VERSION-MIGRATION
r2dbc.migrate.resources-path=classpath:/db/migration/postgresql/*.sql
r2dbc.migrate.dialect=postgresql

# POSTGRES-R2DBC - RODA COM COMPOSE
spring.r2dbc.url=$DB_URL
spring.r2dbc.name=$POSTGRES_DB
spring.r2dbc.username=$POSTGRES_USER
spring.r2dbc.password=$POSTGRES_PASSWORD
spring.r2dbc.pool.validation-query=SELECT 1

对我来说,工作完全正常且稳定。

【讨论】:

以上是关于docker-compose - 外部化 spring application.properties的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 外部化配置 - @ConfigurationProperties @EnableConfigurationProperties

研发环境容器化实施过程(docker + docker-compose + jenkins)

SpringBoot加载外部依赖

Spring Boot的特性:外部化配置和配置随机值

编程连接期间的 Docker-Compose 错误

在 docker-compose、nginx、mysql 和 php 上运行 wordpress