We have multiple solutions for this:
Secret Docker
Create a file with the properties syntax:
//secret-file.txt
db.password=psw
db.username=user
With this file create a docker secret in your docker :
$ docker secret create test-secret secret-file.txt
And use this with the java library docker-secrets in your java program :
Map<String, String> secrets = DockerSecrets.loadFromFile("test-secret");
System.out.println(secrets.get("db.password")) // readonly
For more example, look here.
Environment variables
Set the environment variables in the docker with -e
argument :
$ docker run -e DB_PASSWORD=pwd -e DB_USERNAME=user registry/image:tag
And use these variables with System::getenv
in your java program :
System.out.println(System.getenv("DB_PASSWORD"))
VM Arguments
This solution depends on your base image that was used to create your Docker container.
Give VM Arguments to the docker run command :
$ docker run -e JAVA_OPTS="-Ddb.password=pwd -Ddb.username=user" registry/image:tag
And use these variables with System::getProperty
in your java program :
System.out.println(System.getProperty("db.password"))
Program arguments
Give arguments to docker run command :
It is important to give the arguments after declaring the image.
$ docker run registry/image:tag pwd user
And use these arguments with main method in your java program :
public static void main(String[] args) {
System.out.println("The password: " + args[0]);
System.out.println("The username: " + args[1]);
}
For better handling of arguments, you can use the Apache's commons-cli java library or use a another library.