docker環(huán)境下java參數(shù)傳遞與獲取
docker環(huán)境下java參數(shù)傳遞與獲取
// 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", "");
// 按優(yōu)先級(jí)獲取
String userName = StringUtils.defaultIfBlank(userEnv, StringUtils.defaultIfBlank(userArg, userProp));
java命令行賦值
#args java -jar docker-java-params-0.0.1.jar --user=jackson #系統(tǒng)屬性 java -jar -Duser=jackson docker-java-params-0.0.1.jar
docker run賦值
#環(huán)境變量、args docker run -e USER='user001' registry.cn-shanghai.aliyuncs.com/00fly/docker-java-params:0.0.1 --user='jackson'
docker-compose賦值
優(yōu)先環(huán)境變量方式,同時(shí)也支持args、系統(tǒng)屬性
新建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'
同級(jí)目錄下執(zhí)行命令
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'
占位符傳遞參數(shù)
docker-compose down && USER1='user001' USER2='user002' USER3='user003' docker-compose up -d && docker logs -f docker-java-params
方法補(bǔ)充
1.docker java實(shí)現(xiàn)傳參
整體流程
首先,我們需要編寫一個(gè)簡(jiǎn)單的Java程序,然后將其打包成一個(gè)Docker鏡像,并在運(yùn)行時(shí)傳遞參數(shù)給這個(gè)程序。
下面是整個(gè)過程的步驟:
- 編寫Java程序
- 編寫Dockerfile
- 構(gòu)建Docker鏡像
- 運(yùn)行Docker容器
具體操作步驟
步驟1:編寫Java程序
首先,我們創(chuàng)建一個(gè)簡(jiǎn)單的Java程序,用于接收參數(shù)并輸出。
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
接下來,我們編寫一個(gè)Dockerfile,用于構(gòu)建Docker鏡像。
FROM openjdk:8-jdk-alpine COPY Main.java / RUN javac Main.java CMD ["java", "Main"]
在這個(gè)Dockerfile中,我們使用了一個(gè)基于Alpine Linux的OpenJDK鏡像,并將我們的Java程序復(fù)制到鏡像中并編譯。
步驟3:構(gòu)建Docker鏡像
現(xiàn)在,我們可以使用以下命令構(gòu)建Docker鏡像。
docker build -t my-java-app .
這將會(huì)構(gòu)建一個(gè)名為my-java-app的Docker鏡像。
步驟4:運(yùn)行Docker容器
最后,我們可以運(yùn)行一個(gè)Docker容器,并傳遞參數(shù)給Java程序。
docker run my-java-app Docker
2.java Docker鏡像傳參數(shù)
在實(shí)際開發(fā)中,可能會(huì)遇到以下幾種情況需要傳遞參數(shù):
- 配置文件路徑:應(yīng)用程序的配置文件位置可能有所不同。
- 運(yùn)行時(shí)參數(shù):某些業(yè)務(wù)邏輯需要運(yùn)行時(shí)傳遞參數(shù)以供處理。
- 環(huán)境變量:一些敏感信息,如密碼可能需要在運(yùn)行時(shí)注入。
如何在 Java 鏡像中傳遞參數(shù)?
1. 使用 Dockerfile 設(shè)置默認(rèn)參數(shù)
在 Dockerfile 中,我們可以使用 ENV 指令來設(shè)置環(huán)境變量,然后在 Java 應(yīng)用中通過 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"]
在這個(gè)例子中,我們定義了一個(gè)名為 APP_CONFIG_PATH 的環(huán)境變量,其值為配置文件的路徑。
2. 在運(yùn)行時(shí)傳遞參數(shù)
在 Docker 運(yùn)行容器時(shí),可以通過命令行參數(shù)傳遞參數(shù)。例如:
docker run -e APP_CONFIG_PATH=/path/to/config -p 8080:8080 my-java-app
3. 在 Java 應(yīng)用中讀取參數(shù)
我們可以通過 System.getProperty() 方法來讀取傳遞的參數(shù)。以下是一個(gè)簡(jiǎn)單的 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);
// 這里可以根據(jù) configPath 加載實(shí)際配置文件
}
}
4. 通過 Docker Compose 傳遞參數(shù)
如果使用 Docker Compose,可以在 docker-compose.yml 文件中定義環(huán)境變量:
version: '3'
services:
myapp:
image: my-java-app
environment:
- APP_CONFIG_PATH=/path/to/config
ports:
- "8080:8080"
參數(shù)傳遞示例總結(jié)
在實(shí)際應(yīng)用中,參數(shù)傳遞可以非常靈活。類似于以下場(chǎng)景可以使得應(yīng)用更具有適應(yīng)性:
- 不同的測(cè)試環(huán)境:可以根據(jù)需求更改參數(shù),而無需修改代碼。
- 增強(qiáng)安全性:通過環(huán)境變量傳遞敏感信息,避免在代碼中硬編碼。
到此這篇關(guān)于docker環(huán)境下java參數(shù)傳遞與獲取的文章就介紹到這了,更多相關(guān)docker傳遞與獲取java參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker-compose安裝RabbitMQ及插件操作步驟
這篇文章主要為大家介紹了docker-compose安裝RabbitMQ及插件操作步驟詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01
Docker 部署 pSQL 服務(wù)器的詳細(xì)教程
本文詳細(xì)介紹了如何使用Edu郵箱申請(qǐng)Azure訂閱并開通免費(fèi)VPS,以及在Ubuntu VPS上通過Docker部署pSQL服務(wù)器的方法,感興趣的朋友跟隨小編一起看看吧2025-02-02
Docker查看鏡像的Dockerfile(docker history和docker inspec
這篇文章主要給大家介紹了關(guān)于Docker查看鏡像的Dockerfile的相關(guān)資料,文中主要運(yùn)用的是docker history和docker inspect命令,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-05-05
如何解決docker logs無法實(shí)時(shí)輸出腳本打印的內(nèi)容
這篇文章主要介紹了如何解決docker logs無法實(shí)時(shí)輸出腳本打印的內(nèi)容問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-07-07
docker-compose鏡像發(fā)布springboot項(xiàng)目的流程分析
Docker-Compose項(xiàng)目由Python編寫,調(diào)用Docker服務(wù)提供的API來對(duì)容器進(jìn)行管理。因此,只要所操作的平臺(tái)支持Docker API,就可以在其上利用Compose來進(jìn)行編排管理,接下來通過本文給大家介紹docker-compose發(fā)布springboot項(xiàng)目的流程分析,一起看看吧2021-06-06
docker?search?mysql報(bào)錯(cuò)問題分析及解決
Docker是現(xiàn)在非常流行的一種容器化技術(shù),能夠方便開發(fā)者將應(yīng)用程序打包進(jìn)入容器,做到跨平臺(tái)的部署,這篇文章主要介紹了docker?search?mysql報(bào)錯(cuò)問題分析及解決的相關(guān)資料,需要的朋友可以參考下2025-11-11
使用Docker鏡像構(gòu)建Go應(yīng)用的實(shí)現(xiàn)方法
本文主要介紹了使用Docker鏡像構(gòu)建Go應(yīng)用的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03
關(guān)于dockerfile build過程中報(bào)/bin/sh: pip: command not found的解決方法
這篇文章主要介紹了關(guān)于dockerfile build過程中報(bào)/bin/sh: pip: command not found的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03

