docker环境下java参数传递与获取
作者:爱码少年 00fly.online
docker环境下java参数传递与获取
// docker-compose.yml -> environment -> USER String userEnv = System.getenv("USER"); // java -jar xxx.jar --user=jackson String userArg = Stream.of(args).filter(arg -> arg.contains("--user")).map(arg -> StringUtils.substringAfter(arg, "=")).collect(Collectors.joining()); // java -jar -Duser=jackson xxx.jar String userProp = System.getProperty("user", ""); // 按优先级获取 String userName = StringUtils.defaultIfBlank(userEnv, StringUtils.defaultIfBlank(userArg, userProp));
java命令行赋值
#args java -jar docker-java-params-0.0.1.jar --user=jackson #系统属性 java -jar -Duser=jackson docker-java-params-0.0.1.jar
docker run赋值
#环境变量、args docker run -e USER='user001' registry.cn-shanghai.aliyuncs.com/00fly/docker-java-params:0.0.1 --user='jackson'
docker-compose赋值
优先环境变量方式,同时也支持args、系统属性
新建docker-compose.yml
services: docker-java-params: image: registry.cn-shanghai.aliyuncs.com/00fly/docker-java-params:0.0.1 container_name: docker-java-params command: --user="user by args" entrypoint: java -server -Djava.security.egd=file:/dev/./urandom -Xshareclasses -Xquickstart -Duser="user by prop" -jar /app.jar deploy: resources: limits: cpus: '1.0' memory: 32M reservations: cpus: '0.05' memory: 32M restart: on-failure environment: - USER=user by env logging: driver: json-file options: max-size: 5m max-file: '1'
同级目录下执行命令
docker-compose up -d && docker logs -f docker-java-params [+] Running 1/1 ✔ Container docker-java-params Started [main] INFO com.fly.simple.MainRun - userEnv: user by env [main] INFO com.fly.simple.MainRun - userArg: user by args [main] INFO com.fly.simple.MainRun - userProp: user by prop [main] INFO com.fly.simple.MainRun - userName: user by env
并且支持占位符
services: docker-java-params: image: registry.cn-shanghai.aliyuncs.com/00fly/docker-java-params:0.0.1 container_name: docker-java-params command: '--user="${USER2}"' entrypoint: 'java -server -Djava.security.egd=file:/dev/./urandom -Xshareclasses -Xquickstart -Duser=${USER3} -jar /app.jar' deploy: resources: limits: cpus: '1.0' memory: 32M reservations: cpus: '0.05' memory: 32M restart: on-failure environment: - USER=${USER1} logging: driver: json-file options: max-size: 5m max-file: '1'
占位符传递参数
docker-compose down && USER1='user001' USER2='user002' USER3='user003' docker-compose up -d && docker logs -f docker-java-params
方法补充
1.docker java实现传参
整体流程
首先,我们需要编写一个简单的Java程序,然后将其打包成一个Docker镜像,并在运行时传递参数给这个程序。
下面是整个过程的步骤:
- 编写Java程序
- 编写Dockerfile
- 构建Docker镜像
- 运行Docker容器
具体操作步骤
步骤1:编写Java程序
首先,我们创建一个简单的Java程序,用于接收参数并输出。
public class Main { public static void main(String[] args) { if (args.length > 0) { System.out.println("Hello, " + args[0] + "!"); } else { System.out.println("Hello, Docker Java!"); } } }
步骤2:编写Dockerfile
接下来,我们编写一个Dockerfile,用于构建Docker镜像。
FROM openjdk:8-jdk-alpine COPY Main.java / RUN javac Main.java CMD ["java", "Main"]
在这个Dockerfile中,我们使用了一个基于Alpine Linux的OpenJDK镜像,并将我们的Java程序复制到镜像中并编译。
步骤3:构建Docker镜像
现在,我们可以使用以下命令构建Docker镜像。
docker build -t my-java-app .
这将会构建一个名为my-java-app的Docker镜像。
步骤4:运行Docker容器
最后,我们可以运行一个Docker容器,并传递参数给Java程序。
docker run my-java-app Docker
2.java Docker镜像传参数
在实际开发中,可能会遇到以下几种情况需要传递参数:
- 配置文件路径:应用程序的配置文件位置可能有所不同。
- 运行时参数:某些业务逻辑需要运行时传递参数以供处理。
- 环境变量:一些敏感信息,如密码可能需要在运行时注入。
如何在 Java 镜像中传递参数?
1. 使用 Dockerfile 设置默认参数
在 Dockerfile 中,我们可以使用 ENV 指令来设置环境变量,然后在 Java 应用中通过 System.getenv() 方法获取。例如:
FROM openjdk:11 COPY ./myapp.jar /app/myapp.jar ENV APP_CONFIG_PATH=/app/config/application.properties CMD ["java", "-jar", "/app/myapp.jar"]
在这个例子中,我们定义了一个名为 APP_CONFIG_PATH 的环境变量,其值为配置文件的路径。
2. 在运行时传递参数
在 Docker 运行容器时,可以通过命令行参数传递参数。例如:
docker run -e APP_CONFIG_PATH=/path/to/config -p 8080:8080 my-java-app
3. 在 Java 应用中读取参数
我们可以通过 System.getProperty() 方法来读取传递的参数。以下是一个简单的 Java 程序:
public class MyApp { public static void main(String[] args) { String configPath = System.getProperty("app.config.path", "default/path/to/config"); System.out.println("Config Path: " + configPath); // 这里可以根据 configPath 加载实际配置文件 } }
4. 通过 Docker Compose 传递参数
如果使用 Docker Compose,可以在 docker-compose.yml 文件中定义环境变量:
version: '3' services: myapp: image: my-java-app environment: - APP_CONFIG_PATH=/path/to/config ports: - "8080:8080"
参数传递示例总结
在实际应用中,参数传递可以非常灵活。类似于以下场景可以使得应用更具有适应性:
- 不同的测试环境:可以根据需求更改参数,而无需修改代码。
- 增强安全性:通过环境变量传递敏感信息,避免在代码中硬编码。
到此这篇关于docker环境下java参数传递与获取的文章就介绍到这了,更多相关docker传递与获取java参数内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!