spring - 在 Spring Boot 应用程序中提取 docker secret 而不是使用属性文件

标签 spring docker-swarm docker-secrets

我正在 docker swarm 堆栈上运行一个 spring boot 应用程序,并希望将 docker secret 用于 token secret 、api key 等......创建 secret 并使它们在我正在运行的 docker 容器中可用是没有问题的以下撰写文件:

version: "3.7"
services:
  app:
    image: myimage
    environment:
      tokenSecret: /run/secrets/tokenSecret
      apiKey: /run/secrets/apiKey
    secrets:
      - tokenSecret
      - apiKey

  frontend:
    .....

  db:
    .....

secrets:
  tokenSecret:
    external: true
  apiKey:
    external: true

secret 是由 printf some_secret | docker secret create tokenSecret - 创建的

在使用 docker secrets 之前,我将这些属性存储在我的 application.properties 中。文件:
tokenSecret: some_secret
apiKey: some_key

并且可以通过以下方式访问它们:
@Component
public class AppProperties {

    private Environment environment;

    @Autowired
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }

    public String getTokenSecret(){
        return environment.getProperty("tokenSecret");
    }

    public String getApiKey(){
        return environment.getProperty("apiKey");
    }
}

现在,使用 docker secrets 并删除 application.properties,getTokenSecretgetApiKey方法返回 docker 容器中 secret 的文件位置:"/run/secrets/tokenSecret"而不是 secret 的内容。将容器文件系统中的 secret 内容加载到我的应用程序中似乎是一项简单的任务,但我仍然不知道什么是最好的方法。

最佳答案

最简单的方法是将自定义 docker-entrypoint.sh 添加到打开文件的 Dockerfile 中。
就像是:

#!/bin/sh

export TOKEN_SECRET=${TOKEN_SECRET:=`cat ${TOKEN_SECRET_FILE}`}

java -noverify -XX:TieredStopAtLevel=1 -Djava.security.egd=file:/dev/./urandom -jar app.jar

在您的 docker-compose.yml 中用于堆栈:
version: '3.7'

services:
  serviceName:
    ...
    environment:
      TOKEN_SECRET_FILE: /run/secrets/tokenSecret
    secrets:
      - tokenSecret

secrets:
  tokenSecret:
    external: true

这样,对于开发环境(没有 Swarm),您可以像之前一样简单地将 TOKEN_SECRET 与您的非加密开发 secret 一起传递

关于spring - 在 Spring Boot 应用程序中提取 docker secret 而不是使用属性文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59493498/

相关文章:

java - Hibernate 无法初始化代理 - 在线程中访问对象时没有 session

java - Spring 中的任务调度程序

Azure 自动缩放和 Docker Swarm

docker - 无人机 CI secret 未填充

spring - 如何重定向与应用程序中的任何@RequestMapping 参数不匹配的任何 url

spring - 如何使以 .jsp 结尾的无效 url 使用 spring 404 页面?

docker - 是否有推荐的方法来测试 Docker 组合文件(理想情况下,部署为堆栈)?

azure - Docker:如何处理重启的节点?

mysql - Docker、AspNetCore、DB 连接字符串最佳实践

docker - 带有传递参数的Dockerfile RUN命令