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)傳參
整體流程
首先,我們需要編寫(xiě)一個(gè)簡(jiǎn)單的Java程序,然后將其打包成一個(gè)Docker鏡像,并在運(yùn)行時(shí)傳遞參數(shù)給這個(gè)程序。
下面是整個(gè)過(guò)程的步驟:
- 編寫(xiě)Java程序
- 編寫(xiě)Dockerfile
- 構(gòu)建Docker鏡像
- 運(yùn)行Docker容器
具體操作步驟
步驟1:編寫(xiě)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:編寫(xiě)Dockerfile
接下來(lái),我們編寫(xiě)一個(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í)際開(kāi)發(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 指令來(lái)設(shè)置環(huán)境變量,然后在 Java 應(yīng)用中通過(guò) 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í),可以通過(guò)命令行參數(shù)傳遞參數(shù)。例如:
docker run -e APP_CONFIG_PATH=/path/to/config -p 8080:8080 my-java-app
3. 在 Java 應(yīng)用中讀取參數(shù)
我們可以通過(guò) System.getProperty() 方法來(lái)讀取傳遞的參數(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. 通過(guò) 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ù),而無(wú)需修改代碼。
- 增強(qiáng)安全性:通過(guò)環(huán)境變量傳遞敏感信息,避免在代碼中硬編碼。
到此這篇關(guān)于docker環(huán)境下java參數(shù)傳遞與獲取的文章就介紹到這了,更多相關(guān)docker傳遞與獲取java參數(shù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
高效Docker鏡像構(gòu)建與部署實(shí)戰(zhàn)指南
在微服務(wù)架構(gòu)和容器化快速發(fā)展的背景下,Docker鏡像已成為應(yīng)用發(fā)布的標(biāo)準(zhǔn)單元,本文將從鏡像構(gòu)建到部署全流程,分享團(tuán)隊(duì)的實(shí)戰(zhàn)經(jīng)驗(yàn)與踩坑解決方案2025-07-07
詳解docker中Dockerfile指令創(chuàng)建鏡像
這篇文章主要介紹了詳解docker中Dockerfile指令創(chuàng)建鏡像,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
詳解java項(xiàng)目打包docker鏡像的幾種方式
本文主要介紹了詳解java項(xiàng)目打包docker鏡像的幾種方式,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-01-01
解決docker安裝完成報(bào):bridge-nf-call-iptables is disabled問(wèn)題
這篇文章主要介紹了解決docker安裝完成報(bào):bridge-nf-call-iptables is disabled問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-11-11
docker?部署?時(shí)序數(shù)據(jù)庫(kù)TDengine的思路詳解
TDengineGUI是一個(gè)基于electron構(gòu)建的,針對(duì)時(shí)序數(shù)據(jù)庫(kù)TDengine的圖形化管理工具,這篇文章主要介紹了docker?部署?時(shí)序數(shù)據(jù)庫(kù)TDengine的思路詳解,需要的朋友可以參考下2025-04-04
騰訊云服務(wù)器docker開(kāi)啟端口后無(wú)法訪問(wèn)的解決方法
本文主要介紹了騰訊云服務(wù)器docker開(kāi)啟端口后無(wú)法訪問(wèn)的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06

