在spring boot应用程序中提取docker机密,而不是使用属性文件
我正在docker swarm堆栈上运行spring boot应用程序,希望使用docker secrets获取令牌机密、api密钥等。。。创建机密并在我运行的docker容器中使用以下compose文件使其可用没有问题:在spring boot应用程序中提取docker机密,而不是使用属性文件,spring,docker-swarm,docker-secrets,Spring,Docker Swarm,Docker Secrets,我正在docker swarm堆栈上运行spring boot应用程序,希望使用docker secrets获取令牌机密、api密钥等。。。创建机密并在我运行的docker容器中使用以下compose文件使其可用没有问题: version: "3.7" services: app: image: myimage environment: tokenSecret: /run/secrets/tokenSecret apiKey: /run/secrets
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
这些秘密是由printf some_secret | docker secret create tokenSecret-
在使用docker secrets之前,我将属性存储在我的应用程序中。属性文件:
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容器中机密的文件位置:“/run/secrets/tokenSecret”
,而不是机密的内容。将机密内容从容器文件系统加载到我的应用程序中似乎很容易,但我仍然不知道最好的方法是什么 最简单的方法是将自定义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),您可以简单地将令牌_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),您可以像以前一样,简单地将令牌_SECRET与未加密的开发密钥一起传递