在 Spring Boot 应用程序中提取 docker 秘密而不是使用属性文件

puh*_*let 6 spring docker-swarm docker-secrets

我正在 docker swarm 堆栈上运行 spring boot 应用程序,并且想使用 docker 密钥作为令牌密钥、api 密钥等...创建密钥并使其在我正在运行的 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
Run Code Online (Sandbox Code Playgroud)

这些秘密是由printf some_secret | docker secret create tokenSecret -

在使用 docker Secret 之前,我将属性存储在我的application.properties文件中:

tokenSecret: some_secret
apiKey: some_key
Run Code Online (Sandbox Code Playgroud)

并可以通过以下方式访问它们:

@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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Hel*_*S69 2

最简单的方法是将自定义 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
Run Code Online (Sandbox Code Playgroud)

在堆栈的 docker-compose.yml 中:

version: '3.7'

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

secrets:
  tokenSecret:
    external: true
Run Code Online (Sandbox Code Playgroud)

这样,对于开发环境(没有 Swarm),您可以简单地传递 TOKEN_SECRET 和您的非加密开发密钥,就像您之前所做的那样