如何处理 Docker-Secrets in application.properties 文件
How to handle Docker-Secrets in application.properties files
如何将 Docker 秘密(来自 /run/secrets 的 files/data)注入 application.properties 文件?使用环境变量安全吗?
首先,application.properties
的秘密数据使用环境变量是不安全的。
谈论秘密时,您主要有两种选择。
如果你使用 Docker Secrets 而没有 Docker Swarm 那么你可以直接加载整个 application.properties
一个秘密,将其安装在 /run/secrets
下并将其作为带有 Spring 标志的配置文件引用。
如果您使用 Docker Secrets with 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 -
application.properties.tmpl
spring.datasource.url={{ secret "db_url" }}
spring.datasource.user={{ secret "db_user" }}
spring.datasource.password={{ secret "db_password" }}
docker-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
部署时,它会自动使用机密内容填充配置,并将其安装在目标路径中。
如果您在 configuration 上订阅 十二要素应用程序 理念,环境变量是存储应用程序机密的合适位置。
使用 Spring 引导,具体来说,可以按照 UPPER_SNAKE_CASE
命名约定将它们设置为容器中的环境变量,该约定映射到 application.properties
或 application.yml
文件。例如,如果你想设置一个数据库密码,就好像它在你的 application.properties
文件中被定义为 database.password=i-am-the-password
但在版本控制中忽略它,你可以这样做:
$ export DATABASE_PASSWORD=i-am-the-password
(或将环境变量注入容器运行时的另一种方法。)
然后可以在 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;
}
}
如何将 Docker 秘密(来自 /run/secrets 的 files/data)注入 application.properties 文件?使用环境变量安全吗?
首先,application.properties
的秘密数据使用环境变量是不安全的。
谈论秘密时,您主要有两种选择。
如果你使用 Docker Secrets 而没有 Docker Swarm 那么你可以直接加载整个
application.properties
一个秘密,将其安装在/run/secrets
下并将其作为带有 Spring 标志的配置文件引用。如果您使用 Docker Secrets with 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 -
application.properties.tmpl
spring.datasource.url={{ secret "db_url" }}
spring.datasource.user={{ secret "db_user" }}
spring.datasource.password={{ secret "db_password" }}
docker-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
部署时,它会自动使用机密内容填充配置,并将其安装在目标路径中。
如果您在 configuration 上订阅 十二要素应用程序 理念,环境变量是存储应用程序机密的合适位置。
使用 Spring 引导,具体来说,可以按照 UPPER_SNAKE_CASE
命名约定将它们设置为容器中的环境变量,该约定映射到 application.properties
或 application.yml
文件。例如,如果你想设置一个数据库密码,就好像它在你的 application.properties
文件中被定义为 database.password=i-am-the-password
但在版本控制中忽略它,你可以这样做:
$ export DATABASE_PASSWORD=i-am-the-password
(或将环境变量注入容器运行时的另一种方法。)
然后可以在 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;
}
}