我正在 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,
getTokenSecret
和 getApiKey
方法返回 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/