在 docker-compose 中的 Spring Boot 应用程序中使用外部配置

Rom*_*n T 2 spring spring-boot docker-compose

我有一个 Spring Boot 应用程序,用于com.spotify.dockerfile-maven-plugin构建我的应用程序 org.rtu/some-importer 的 docker 映像

我的 docker-compose.yml 是:

version: '3'
services:
  some-importer:
    image: org.rtu/some-importer
    build: .
  zookeeper:
    image: wurstmeister/zookeeper
    ports:
      - "2181:2181"
  kafka: 
    image: wurstmeister/kafka
    ports:
      - "9092:9092"
    environment:
      KAFKA_ADVERTISED_HOST_NAME: 172.17.0.1
      KAFKA_CREATE_TOPICS: "test:1:1"
      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
Run Code Online (Sandbox Code Playgroud)

我怎么能说的过程中docker-compose up,它应该使用一个外部config.properties/data/some-importer/config文件夹?

g00*_*00b 6

正如评论中提到,第一步是在 docker 容器中挂载一个主机目录(就像你为 Kafka 所做的那样)。例如,您可以使用:

version: '3'
services:
  some-importer:
    image: org.rtu/some-importer
    build: .
    # Adding a volume/mount
    volumes:
      - /data/some-importer/config:/config
Run Code Online (Sandbox Code Playgroud)

这会将/data/some-importer/config文件夹映射到/configDocker 容器中。

注意:链接的答案还提到您可以在Dockerfileusing 中添加它ADD。但是,这会将其添加到图像本身。如果对配置进行更改,则必须重建映像以使这些更改生效。

下一步是告诉 Spring boot 使用这个配置文件。如果您想要一个完全自定义的位置(例如/config/config.properties),那么您可以spring.config.location在启动期间使用该参数。

注意:如果您的配置位于某些文件夹中, Spring Boot 将自动选取您的配置。否则,您必须使用spring.config.location.

我不知道你的图像是什么样子,但你应该能够做这样的事情:

ENTRYPOINT [ "sh", "-c", "java -jar /app.jar --spring.config.location=$CONFIG_LOCATION" ]
Run Code Online (Sandbox Code Playgroud)

我正在使用一个名为$CONFIG_LOCATIONhere的环境变量,这使得使用环境变量自定义位置变得更加容易。例如,您可以在docker-compose.yml文件中添加以下内容:

ENTRYPOINT [ "sh", "-c", "java -jar /app.jar --spring.config.location=$CONFIG_LOCATION" ]
Run Code Online (Sandbox Code Playgroud)