0

如何将 Docker 机密(来自 /run/secrets 的文件/数据)注入到 application.properties 文件中?使用环境变量是否安全?

4

2 回答 2

0

首先,将环境变量用于机密数据application.properties是不安全的。

在谈论秘密时,您主要有两种选择。

  1. 如果您在没有 Docker Swarm的情况下使用 Docker Secrets,那么您可以直接将整个加载到application.properties一个密钥中,将其挂载在下面/run/secrets并将其作为带有 Spring 标志的配置文件引用。

  2. 如果您将 Docker Secrets与 Docker Swarm 一起使用,那么您可以将您感兴趣的具体字段作为秘密存储,并使用 Swarm 的配置模板与它们相关联。

例子:

echo -n "myUser" | docker secret create db_user -
echo -n "myPass" | docker secret create db_password -
echo -n "jdbc://..." | docker secret create db_url -

应用程序.properties.tmpl

spring.datasource.url={{ secret "db_url" }}
spring.datasource.user={{ secret "db_user" }}
spring.datasource.password={{ secret "db_password" }}

码头工人-compose.yml

version: '3.9'
services:
  api:
    image: yourapp:1.0.0
  configs:
    - source: application.properties
      target: /usr/app/config/application.properties
  secrets:
    - db_url
    - db_user
    - db_password

configs:
  application.properties:
    template_driver: golang
    file: ./application.properties.tmpl
    name: myapp.application.properties

secrets:
  db_url:
    external: true
  db_user:
    external: true
  db_password:
    external: true

当您使用 进行部署时docker stack deploy -c docker-compose.yml myapp,它会自动使用机密内容填充配置,并将其挂载到目标路径中。

于 2021-11-17T16:23:02.470 回答
0

如果您订阅了关于配置的十二要素应用程序哲学,那么环境变量是存储应用程序机密的合适位置。

UPPER_SNAKE_CASE具体来说,使用 Spring Boot,可以按照映射到您的application.propertiesapplication.yml文件中的键的命名约定将它们设置为容器中的环境变量。例如,如果你想设置一个数据库密码,就像它database.password=i-am-the-password在你的application.properties文件中定义一样,但从版本控制中省略它,你可以这样做:

$ export DATABASE_PASSWORD=i-am-the-password

(或将 env var 注入容器运行时的另一种方法。)

然后可以在 Java 代码中访问数据库密码,如下所示:

import org.springframework.beans.factory.annotation.Value;

public class Example {

  private final String databasePassword;

  public Example(
      @Value("${database.password}") String databasePassword) {

    this.databasePassword = databasePassword;
  }
}
于 2021-11-17T16:30:24.390 回答