Java 没有 Spring 的隐藏属性

Java hidden properties without Spring

我目前正在创建一个使用 MongoDB 数据库的 Java 程序,并将连接信息存储在属性文件中。

但是我的项目在 GitHub 上是开源的,我无法在属性文件中存储连接信息。

所以我想问你是否可以提供来自 docker 运行 的登录信息。

示例:docker run registry/image -args db.password=psw db.username=user

我在 Whosebug 中看到了解决方案,但所有解决方案都使用 Spring 功能,但我的项目没有使用 Spring 框架。

我们有多种解决方案:

秘密Docker

使用属性语法创建文件:

//secret-file.txt
db.password=psw
db.username=user

使用此文件在您的 docker 中创建一个 docker 秘密 :

$ docker secret create test-secret secret-file.txt

并在您的 java 程序中将其与 java 库 docker-secrets 一起使用:

Map<String, String> secrets = DockerSecrets.loadFromFile("test-secret");
System.out.println(secrets.get("db.password")) // readonly

有关更多示例,请查看 here


环境变量

在 docker 中使用 -e 参数设置环境变量:

$ docker run -e DB_PASSWORD=pwd -e DB_USERNAME=user registry/image:tag

并在您的 java 程序中将这些变量与 System::getenv 一起使用:

System.out.println(System.getenv("DB_PASSWORD"))

虚拟机参数

此解决方案取决于用于创建 Docker 容器的基础映像。

VM 参数 提供给 docker 运行 命令:

$ docker run -e JAVA_OPTS="-Ddb.password=pwd -Ddb.username=user" registry/image:tag

并在您的 java 程序中将这些变量与 System::getProperty 一起使用:

System.out.println(System.getProperty("db.password"))

程序参数

为 docker 运行 命令提供参数:

声明图像后给出参数很重要。

$ docker run registry/image:tag pwd user

并在 java 程序中将这些参数与 main 方法一起使用:

public static void main(String[] args) {
    System.out.println("The password: " + args[0]);
    System.out.println("The username: " + args[1]);
}

为了更好地处理参数,您可以使用 Apache 的 commons-cli java library or use a another library

如果您在 AWS 上托管此应用程序,则可以选择使用 Secrets Manager,它具有 Spring -

的集成启动项目