带有 Spring Boot 应用程序的 docker secret 在 docker swarm 模式 /run/secrets 下不起作用

Posted

技术标签:

【中文标题】带有 Spring Boot 应用程序的 docker secret 在 docker swarm 模式 /run/secrets 下不起作用【英文标题】:docker secret with spring boot application is not working in docker swarm mode /run/secrets 【发布时间】:2019-03-05 03:07:11 【问题描述】:

我正在尝试为 mysql 容器和 Spring Boot 应用程序的 DB 密码设置环境变量,这通常在 docker secrets 中声明。

echo "db_secured_password" | docker secret create secret -

这里是配置文件:

spring boot 应用的 -> application.yml

db:
  name: my-db
  host: localhost
  port: 3306
  username: root
  password: /run/secrets/db-root-password
spring:
  application:
    name: core-backend
  datasource:
    url: jdbc:mysql://$db.host:$db.port/$db.name
    username: $db.username
    password: $db.password

用于 docker swarm 模式下的 docker stack -> docker-compose.yml

version: '3.1'

services: 

  mysql-db:
    container_name: mysql-db
    image: mysql:8.0.12
    deploy:
      restart_policy:
        condition: on-failure
    volumes:
      - ./data/mysql:/var/lib/mysql
      - ./conf/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    environment:
      - MYSQL_ROOT_PASSWORD=/run/secrets/db-root-password
      - MYSQL_DATABASE=my_db
    ports: 
      - "3306:3306"
    secrets: 
      - db-root-password

  spring-boot-app:
    container_name: spring-boot-app
    image: spring-boot-app:local
    environment:
      - DB_PASSWORD=/run/secrets/db-root-password
# Also tried adding with the file as property name
#     - DB_PASSWORD_FILE=/run/secrets/db-root-password
    ports:
      - "8080:8080"
    environment:
      HOST_NAME: localhost
    secrets: 
      - db-root-password
    depends_on:
      - mysql-db

secrets:
  db-root-password:
    external: true

我使用以下命令运行 docker 堆栈:

docker stack deploy --with-auth-registry -c docker-compose.yml test-stack 

我无法准确获取 db-root-password 属性的值 在春季启动应用程序中。当我检查db-root-password 的值时,我 获取值为/run/secrets/db-root-password

有什么遗漏吗? 如果我想以不同的方式覆盖环境变量的值?

【问题讨论】:

【参考方案1】:

我们通过使用“printf”而不是“echo”解决了同样的问题,echo 的问题是它会在 docker secret 中留下一个换行符。您可以参考 docker secret create => https://docs.docker.com/engine/reference/commandline/secret_create/

中的示例

我还有一个例子,将 docker 机密直接加载到 spring 属性中,例如 "spring.datasource.password" => https://github.com/kwonghung-YIP/spring-boot-docker-secret

【讨论】:

如果你使用 'echo -n' 来避免输入换行符,则相同【参考方案2】:

我认为您需要从秘密文件中挂载密码,请在此处查看示例“在 Compose 中使用秘密”https://docs.docker.com/engine/swarm/secrets/#build-support-for-docker-secrets-into-your-images

【讨论】:

不,我没有找到您关于安装机密的建议的解决方案。您有任何特定于 Spring Boot 应用程序的示例吗?附言即使我尝试在正在运行的容器(spring boot app)上执行 exec 来检查目录/run/secrets/*,我也看到所有密码都存在。但是 spring boot 应用程序无法读取它。

以上是关于带有 Spring Boot 应用程序的 docker secret 在 docker swarm 模式 /run/secrets 下不起作用的主要内容,如果未能解决你的问题,请参考以下文章

带有 FeignClient 的 Spring Boot RepositoryRestResource

使用docker构建第一个spring boot项目

在 Spring Boot 应用程序中嵌入带有作业定义的 Spring Batch Admin

带有 spring-boot 和 angularjs 的 CORS 不起作用

带有 MVC 的 Spring Boot SOAP Web 服务

无法加载在 Docker 中运行的 Spring Boot 应用程序