Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在spring boot应用程序中提取docker机密,而不是使用属性文件_Spring_Docker Swarm_Docker Secrets - Fatal编程技术网

在spring boot应用程序中提取docker机密,而不是使用属性文件

在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

我正在docker swarm堆栈上运行spring boot应用程序,希望使用docker secrets获取令牌机密、api密钥等。。。创建机密并在我运行的docker容器中使用以下compose文件使其可用没有问题:

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与未加密的开发密钥一起传递