Jenkins+Gitee+Docker容器化部署
写在前文
本文主要是通过Jenkins的maven项目版本+Gitee+Docker-maven插件来进行部署的,本文没有使用dockerfile/docker-compose。
本文默认已经安装了Docker
1、安装Jenkins
Step1、创建文件夹当作映射jenkins的home文件夹
mkdir /app/jenkins
Step2、赋权(必须要做...) 主要是写入权限
chmod -R 777 /app/jenkins
Step3、拉取并运行jenkins镜像
Docker版本
拉取镜像:docker pull jenkins/jenkins:lts运行容器:
docker run --name jenkins \-p 8099:8080 -p 50000:50000 \-v /var/run/docker.sock:/var/run/docker.sock \-v $(which docker):/bin/docker \-v /app/jenkins:/var/jenkins_home \-v /app/jdk/jdk17:/opt/java--group-add=$(getent group docker | cut -d: -f3) \-d jenkins/jenkins:lts参数解释:(-v /var/run/docker.sock:/var/run/docker.sock-v $(which docker):/bin/docker):这两句主要是为了保证在jenkins中能运行宿主机的docker,方便后续在jenkins容器中执行docker命令;-v /app/jdk/jdk17:/opt/java:将宿主机的JDK挂在到容器内部---也可以去掉这一行,方便后续在jenkins界面配置“JDK”位置时使用。jenkins默认的是openjdk21版本,位置在jenkins容器中的“opt/java/openjdk21”-v /app/jenkins:/var/jenkins_home:将jenkins的工作目录挂在到宿主机中。--group-add=$(getent group docker | cut -d: -f3):是为了动态的将宿主机的docker的组GID传递给jenkins容器,不然在jenkins中执行docker命令可能要报错“permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.45/containers/json": dial unix /var/run/docker.sock: connect: permission denied”
当然可以分别执行getent group docker,输出示例“docker:x:992:”,然后添加“--group-add=992”即可
docker-compoe.yml版本 --- 没测试过
version: "3.5"
services:jenkins:# 这里的版本号,使用从官网上查看的最新 LTS 版本号image: jenkins/jenkins:ltscontainer_name: jenkinsprivileged: truerestart: alwaysports:# web访问端口- "8066:8080"# 基于JNLP的Jenkins代理端口- "50000:50000"volumes:# jenkins的数据和配置文件目录映射- /app/jenkins/data:/var/jenkins_home# 将外部的jdk目录映射到容器内部- /app/jdk:/app/jdk# 将外部的maven目录映射到容器内部- /app/maven:/app/maven
Step3、页面访问
http://ip:8099/login?from=%2F
Step4、获取登录密码
cat /app/jenkins/secrets/initialAdminPassword
我是将jenkins_home的工作目录映射到了本地的“/app/jenkins”目录下面,所以在这个目录下,具体根据step3中映射路径来判断,原始是在“工作目录下面的:secrets/initialAdminPassword”即:/var/jenkins_home/secrets/initialAdminPassword路径下的密码即可
Step5、修改登录密码
修改密码后,系统会自动混合密码.所以很长...
Step6、安装必要插件 (git、maven、gitee)
位置:Manage Jenkins》Plugins》Available plugins
Step7、配置Jenkins运行环境(JDK、git、maven)
位置:Dashboard》Manage Jenkins》Tools
配置JDK
新版的jenkins默认的JDK为openjdk21版本(在容器内的opt/java/openjdk目录),所以我们如果要使用宿主机的jdk,那么需要将宿主机的jdk挂载到jenkins容器内部的opt/java位置(即Step3中“-v /app/jdk/jdk17:/opt/java”参数)。
配置git
采用默认即可
配置maven
采用默认即可
2、使用Docker制作JDK镜像
Step1、将本地jdk制作成镜像
新建Dockerfile文件,内容如下,需保证Dockerfile和本地jdk目录在同一个目录:
# 多阶段构建 - 第一阶段:准备JDK
FROM ubuntu:20.04 AS builderWORKDIR /opt
# 复制JDK目录到容器中
COPY ./jdk17 /opt/jdk17# 第二阶段:创建最终镜像
FROM ubuntu:20.04# 更新包列表并安装必要的依赖
RUN apt-get update && apt-get install -y \ca-certificates \&& rm -rf /var/lib/apt/lists/*# 从第一阶段复制JDK
COPY --from=builder /opt/jdk17 /opt/java# 设置环境变量
ENV JAVA_HOME=/opt/java
ENV PATH=$JAVA_HOME/bin:$PATH# 验证Java安装
RUN java -version# 设置默认命令
CMD ["java", "-version"]
Step2、执行Dockerfile脚本
# docekr build -t 镜像名称:镜像版本 Dockerfile所在位置
docker build -t my-jdk17:17. (有一个点)
Step3、运行容器测试
docker run --rm my-jdk17:17 java -version
Step4、容器打包:.tar包。保存为tar文件
# docker save -o .tar包名称 对应的jdk名称:版本
docker save -o my-jdk-17.tar my-jdk17:17
Step5、加载镜像文件
docker load -i my-jdk-17.tar
3、开启Docker远程访问权限
vi /lib/systemd/system/docker.service
# 在“ExecStart=/usr/bin/dockerd -H fd://”下面添加内容:
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H tcp://0.0.0.0:2375
# 然后重启docker
systemctl daemon-reload && systemctl restart docker
4、Java项目添加Docker-Maven插件并配置---仅docker,干净单环境版本
Step1、编写application.yml
server:port: 8080
spring:profiles:active: devapplication:name: docker-test
Step2、编写DockerController.java
package com.lanting.docker.controller;import jakarta.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.lang.management.GarbageCollectorMXBean;
import java.lang.management.ManagementFactory;
import java.lang.management.MemoryMXBean;
import java.lang.management.RuntimeMXBean;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;@RestController
@RequestMapping("/docker")
public class DockerController {@Value("${lanting.key}")private String key;@GetMapping("/key/{name}")public String getKey(@PathVariable("name") String name) {System.out.println(key + "----name:" + name + "---" + lanting);return key + " " + lanting;}@GetMapping("/jvm/details")public Map<String, Object> getJvmDetails() {Map<String, Object> details = new LinkedHashMap<>();// 1. 获取内存信息MemoryMXBean memoryMxBean = ManagementFactory.getMemoryMXBean();details.put("HeapMemory", memoryMxBean.getHeapMemoryUsage());details.put("NonHeapMemory", memoryMxBean.getNonHeapMemoryUsage());// 2. 获取GC信息List<GarbageCollectorMXBean> gcMxBeans = ManagementFactory.getGarbageCollectorMXBeans();List<String> gcInfo = gcMxBeans.stream().map(bean -> bean.getName() + " (count=" + bean.getCollectionCount() + ", time=" + bean.getCollectionTime() + "ms)").collect(Collectors.toList());details.put("GarbageCollectors", gcInfo);// 3. 获取运行时参数(包含-X -XX参数)RuntimeMXBean runtimeMxBean = ManagementFactory.getRuntimeMXBean();details.put("JVMArguments", runtimeMxBean.getInputArguments());// 4. 获取系统属性(-D参数)details.put("SystemProperties", runtimeMxBean.getSystemProperties());return details;}
}
Step3、启动类DockerTestMain.java
@SpringBootApplication
public class DockerTestMain {public static void main(String[] args) {SpringApplication.run(DockerTestMain.class, args);System.out.println("启动成功....");}
}
Step4、编写pom.xml
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lanting</groupId><artifactId>docker-test</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><docker.image.prefix>lanting</docker.image.prefix></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!-- 添加maven命令:clean package -Pprod,test docker:removeImage docker:build --><!-- 添加maven命令:clean install -Dmaven.test.skip=true docker:removeImage docker:build --><!-- 添加maven命令:clean package -Pprod,test,dev -Dmaven.test.skip=true docker:removeImage docker:build --><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version><configuration><!-- <imageName>${docker.image.prefix}/app</imageName>--><!-- 镜像名称:[DockerTest:1.0-SNAPSHOT]。镜像名称必须小写...否在要报错。会报错:on project DockerTest: Exception caught: Request error: DELETE ... 400, body: {"message":"invalid reference format: repository name (library/DockerTest) must be lowercase"}: HTTP 400 Bad Request -> [Help 1] --><imageName>${project.artifactId}:${project.version}</imageName><!-- 基于这个镜像构建镜像 --><baseImage>my-jdk17:17</baseImage><!-- JAR 文件路径:docker-test-1.0-SNAPSHOT.jar 必须位于容器的根目录(/)--><!-- <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>--><!-- 下面sh -c 这个命令可以解析JVM(-Xmx、-Xms等)参数,不然我们只能使用默认JVM参数,即在docker启动中可以使用“-e JAVA_OPTS="-Xms=512m -Dlanting.name=张三"”来设置启动参数,不然系统无法通过“@Value(${lanting.name}})”解析参数, --><entryPoint>["sh", "-c","java $JAVA_OPTS -jar /${project.build.finalName}.jar \"$@\""]</entryPoint><!-- <dockerDirectory>src/main/docker</dockerDirectory>--><!--<dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>--><!-- 制作的镜像放在哪里 --><dockerHost>http://远程docekr的ip:2375</dockerHost><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin></plugins></build>
</project>
注意:到此步为止,我们可以直接通过Maven+构建命令“clean package -Pprod docker:removeImage docker:build”将,本地的jar包发布到远程的docker容器中。
注意:docker:removeImage命令删除的是“${project.artifactId}:${project.version}”这个容器,如果是多环境,-P指定的最好是单个具体的环境,不然系统会默认第一个的环境
Edit Configurations》+》Maven
Step5、Maven编译
Step5、运行容器&查看启动日志&访问接口测试
运行容器:docker run -di --name=web1 -p 9090:8080 docker-test:1.0-SNAPSHOT
访问容器:http://ip:9090/docker/get/123
5、gitee管理项目版本
Step1、新建项目仓库
在gitee创建一个项目,空文件夹即可。
Step2、本地上传
然后在windows中,使用:git init 初始化要上传的项目;
再使用"git add ."
将所有文件添加到git版本管理中 ....
最后使用IDEA的插件上传即可 ......省略git操作
6、Docker+jenkins+gitee+多环境切换版本
Step1、编写application.yml---有变动
server:port: @server.port@
# port: ${SERVER_PORT:8090}
#Spring Boot 的 Profile 激活优先级(从高到低):
### 命令行参数 (--spring.profiles.active=prod)
### 环境变量 (SPRING_PROFILES_ACTIVE=prod)
### JVM 参数 (-Dspring.profiles.active=prod)
### application.yml 中的静态配置
### 默认 Profile(如果没有设置)
spring:profiles:# 注意大小写...。配置了这个就可以在docekr run中传入active: ${my.profiles.active}
# active: @profiles.active@
# active: ${profiles.active:dev}
# active: ${SPRING_PROFILES_ACTIVE:dev}application:name: @project.artifactId@
Step2、编写pom.xml---有变动
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.4.0</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.lanting</groupId><artifactId>docker-test</artifactId><version>1.0-SNAPSHOT</version><properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><docker.image.prefix>lanting</docker.image.prefix></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!-- 添加maven命令:clean package -Pprod,test docker:removeImage docker:build --><!-- 添加maven命令:clean install -Dmaven.test.skip=true docker:removeImage docker:build --><!-- 添加maven命令:clean package -Pprod,test,dev -Dmaven.test.skip=true docker:removeImage docker:build --><groupId>com.spotify</groupId><artifactId>docker-maven-plugin</artifactId><version>1.2.2</version><configuration><!-- <imageName>${docker.image.prefix}/app</imageName>--><!-- 镜像名称:[DockerTest:1.0-SNAPSHOT]。镜像名称必须小写...否在要报错。会报错:on project DockerTest: Exception caught: Request error: DELETE ... 400, body: {"message":"invalid reference format: repository name (library/DockerTest) must be lowercase"}: HTTP 400 Bad Request -> [Help 1] --><imageName>${project.artifactId}-${my.profiles.active}:${project.version}</imageName><!-- 基于这个镜像构建镜像 --><baseImage>my-jdk17:17</baseImage><!-- JAR 文件路径:docker-test-1.0-SNAPSHOT.jar 必须位于容器的根目录(/)--><!-- <entryPoint>["java","-jar","/${project.build.finalName}.jar"]</entryPoint>--><!-- 下面sh -c 这个命令可以解析JVM(-Xmx、-Xms等)参数,不然我们只能使用默认JVM参数,即在docker启动中可以使用“-e JAVA_OPTS="-Xms=512m -Dlanting.name=张三"”来设置启动参数,不然系统无法通过“@Value(${lanting.name}})”解析参数, --><entryPoint>["sh", "-c","java $JAVA_OPTS -jar /${project.build.finalName}.jar \"$@\""]</entryPoint><!-- <dockerDirectory>src/main/docker</dockerDirectory>--><!--<dockerDirectory>${project.basedir}/src/main/resources/docker</dockerDirectory>--><!-- 制作的镜像放在哪里 --><dockerHost>http://ip:2375</dockerHost><resources><resource><targetPath>/</targetPath><directory>${project.build.directory}</directory><include>${project.build.finalName}.jar</include></resource></resources></configuration></plugin><!-- <plugin><groupId>com.spotify</groupId><artifactId>dockerfile-maven-plugin</artifactId><version>1.4.2</version><configuration><repository>docker_storage/${project.artifactId}</repository><buildArgs><JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE></buildArgs></configuration></plugin>--><!-- 这个如果不配置,只能在application.yml中只能通过@...@带入,docker又无法通过@...@带入 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-resources-plugin</artifactId><configuration><delimiters><!-- 使用${..}作为占位符 --><delimiter>${*}</delimiter></delimiters><!-- 同时还支持使用默认的占位符(@..@) --><useDefaultDelimiters>true</useDefaultDelimiters></configuration></plugin></plugins><!-- 要使用下面的多环境,就需要配置 --><resources><resource><directory>src/main/resources</directory><filtering>true</filtering> <!-- 启用资源过滤 --><includes><include>**/application*.yml</include> <!-- 过滤所有环境配置文件 --></includes></resource></resources></build><!-- 多环境配置:可以在application.yml中使用@profiles.active@获取,在jenkins脚本中也可以使用@server.port@获取端口 --><profiles><!-- 开发环境 --><profile><id>dev</id><properties>
<!-- <profiles.active>dev</profiles.active>--><my.profiles.active>dev</my.profiles.active><server.port>8090</server.port> <!-- 开发环境端口 --></properties><activation><activeByDefault>true</activeByDefault> <!-- 默认激活 --></activation></profile><!-- 生产环境 --><profile><id>prod</id><properties>
<!-- <profiles.active>prod</profiles.active>--><my.profiles.active>prod</my.profiles.active><server.port>9090</server.port> <!-- 生产环境端口 --></properties></profile><!-- 测试环境 --><profile><id>test</id><properties><!-- <profiles.active>test</profiles.active>--><my.profiles.active>test</my.profiles.active><server.port>10086</server.port> <!-- 生产环境端口 --></properties></profile></profiles>
</project>
Step3、在jenkins中创建item--项目
设置item name名称+maven项目
Step4、添加gitee的地址
Step5、新增gitee的账号密码
通过用户名&密码拉取项目
通过API令牌获取---测试没通过...
gitee获取私人令牌地址:https://gitee.com/profile/personal_access_tokens
Step6、构建任务的方式
本文将选择4种构建方式:
1、定期检查构建:定时检查代码是否有更新,如果有再编译更新
2、通过webhook构建:根据上传代码时提供的备注来触发;
3、token构建:通过远程API+token形式触发;
4、根据版本构建:根据build时,检查SNAPSHOT版本是否变动来构建
可以多选
1、构建方法一、二:定期检查+版本是否变动
2、通过api的url+token远程更新构建
3、通过webhook构建
Step7、构建命令(Maven版本才有)
到这一步为止,就可以直接builder拉取项目并构建容器了。但是,通过这种方法构建的容器,还不能运行(可以通过docker images;查看容器镜像),如果需要docker ps查看到运行的容器,那么我们需要在Step8设置启动脚本才行
构建命令:clean package -Pprod,test -Dmaven.test.skip=true docker:removeImage docker:build
其中-Pprod,test 是激活prod,test这两个环境,后续就可以在--spring.profiles.active中选择test/prod环境了。
如果只激活prod即-Pprod环境时,我们可以 不用设置--spring.profiles.active,系统会自动切换为prod环境
在IDEA中可以在“Edit Configurations...”中选择Maven添加即可:
为了方便,在maven编译时,最好选择具体的某一个环境进行编译,比如:clean package -Pprod -Dmaven.test.skip=true docker:removeImage docker:build;
不然在执行“docker:removeImage”时,系统会默认选择“-Pprod,test”其中的第一个环境来删除,也就是“prod”环境的docker容器会被删除
后续在使用时就不用通过--spring.profiles.active=prod来设置了
idea中的配置
Jenkins中配置(多环境时通过-P来指定环境)
Step8、构建执行脚本
选择Post Steps》Execute shell
脚本内容如下:
本脚本会根据选择的pom中的具体的profile(dev/test/prod)来实现容器名称不同的案例,严格意义上来说,再单机环境下,如果我们提前在“mvn package -Ptest,dev,prod...”中激活了多环境配置(每个环境端口不一样)时,我们再新建一个item时,只需要更改“ACTIVE_PROFILE”的值,然后其他条件不变的情况下,是可以部署多个服务的。
#!/bin/bash
cd $WORKSPACE
# 固定写死 - 激活环境/对外暴露的端口
ACTIVE_PROFILE=test
CONTAINER_NAME="web1"-$ACTIVE_PROFILE # 容器名称# 动态获取当前激活的主profile(从构建参数中提取)
# --只能获取“clean package -Pprod,test -Dmaven.test.skip=true docker:removeImage docker:build”中的 test环境
# 如果要启用这个,那么我们可以只启动一个-Pprod即可。
# ACTIVE_PROFILE=$(echo "$MAVEN_GOALS" | grep -oP '(?<=-P)[^ ]+' | cut -d',' -f1)# 获取镜像名称和端口(关联激活的profile)
IMAGE_NAME=$(mvn help:evaluate -Dexpression=project.artifactId -q -DforceStdout)-$ACTIVE_PROFILE:$(mvn help:evaluate -Dexpression=project.version -q -DforceStdout)
IMAGE_PORT=$(mvn help:evaluate -P$ACTIVE_PROFILE -Dexpression=server.port -q -DforceStdout)# 停止并删除旧容器
if docker ps -a --format '{{.Names}}' | grep -q "^${CONTAINER_NAME}$"; thenecho "停止并删除容器: $CONTAINER_NAME"docker stop $CONTAINER_NAME >/dev/null 2>&1docker rm $CONTAINER_NAME >/dev/null 2>&1
fi# 清理悬空镜像(可选)
docker image prune -f >/dev/null 2>&1# 启动新容器
echo "启动容器: $CONTAINER_NAME (镜像: $IMAGE_NAME) (端口:$HOST_IMAGE_PORT:$IMAGE_PORT)"
docker run -d \
--name $CONTAINER_NAME \
--log-driver json-file \
--log-opt max-size=10m \
-p $IMAGE_PORT:$IMAGE_PORT \
-e JAVA_OPTS="-Xms512m -Xmx512m -XX:+UseZGC -XX:MaxMetaspaceSize=512m -XX:NewSize=512m -XX:MaxNewSize=512m -XX:SurvivorRatio=6 -XX:MaxTenuringThreshold=15 -XX:+AlwaysPreTouch -Dlanting.name=\"张三\"" \
$IMAGE_NAME \
--spring.profiles.active=$ACTIVE_PROFILE# =================================================================================
-e JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseZGC -XX:MaxMetaspaceSize=512m-XX:NewSize=2g -XX:MaxNewSize=2g-XX:SurvivorRatio=6-XX:MaxTenuringThreshold=15-XX:+AlwaysPreTouch
"
-XX:+UseZGC JDK11+低延迟场景(亚毫秒级GC)
-XX:MaxMetaspaceSize 限制元空间大小(默认无限制)
-XX:NewSize/MaxNewSize 精确控制新生代大小
-XX:MaxTenuringThreshold 对象晋升老年代的年龄阈值
-XX:+AlwaysPreTouch 启动时预分配内存(避免运行时延迟)-e JAVA_OPTS="-Xms2g -Xmx4g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:SurvivorRatio=8 -XX:NewRatio=2"
-Xms 初始堆大小 2g(根据实际需求调整)
-Xmx 最大堆大小 建议与-Xms 相同(避免动态扩容)
-XX:+UseG1GC 使用G1垃圾回收器 JDK9+默认,适合大内存
-XX:MaxGCPauseMillis 目标最大GC停顿时间 200(毫秒,按需调整)
-XX:SurvivorRatio Eden/Survivor区比例 8(Eden:Survivor=8:1:1)
-XX:NewRatio 新生代/老年代比例 2(新生代占堆的1/3)
Step9、立刻构建
除了选择Build Now立刻构建以外,具体可以根据Step6中定义的构建方法来构建
额外补充:多环境配置
我们通过pom.xml的profiles来配置多环境时,要分清“构建时配置”和“启动/运行时配置”。
构建时配置,要手动激活,比如执行命令maven命令时,“mvn clean install -Ptest1,test2”其中(test1,test2)就是我们要激活的配置,默认情况下系统会默认激活由“true”设置的环境。
启动/运行时配置,一般是通过“--spring.profiles.active=prod”或者“-Dspring.profiles.active=prod”来设置,完整启动命令如下:
设置方法一:JVM参数 (IDEA:VM options) & 系统属性
# 命令行Java -jar启动
java -Dspring.profiles.active=test -Dlanting.name=张三 -jar xxx.jar# IDEA启动
Edit Configurations...>>>Modify option>>>Add VM options
添加:-Dspring.profiles.active=prod -Dlanting.name=张三# Docker 启动
docker run -d \--name $CONTAINER_NAME \-e PARAMS="--spring.profiles.active=prod --lanting.name=张三" \-e JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseZGC -XX:MaxMetaspaceSize=512m -XX:NewSize=2g -XX:MaxNewSize=2g - XX:SurvivorRatio=6 -XX:MaxTenuringThreshold=15 -XX:+AlwaysPreTouch" \-p $IMAGE_PORT:$IMAGE_PORT \$IMAGE_NAME \
或者合并
docker run -d \--name $CONTAINER_NAME \-e JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseZGC -Dspring.profiles.active=prod -Dlanting.name=张三 " \-p $IMAGE_PORT:$IMAGE_PORT \$IMAGE_NAME \
Java代码获取:String config = System.getProperty("lanting.name"); // 得到 "张三"
设置方法二:命令行参数(IDEA:Program arguments)
# 命令行java -jar 启动
java -jar xxx.jar --spring.profiles.active=prod --lanting.name=张三
# IDEA启动
Edit Configurations...>>>Modify option>>>Program arguments
添加:--spring.profiles.active=test --lanting.name=lanting李四# docker启动:
docker run -d \--name $CONTAINER_NAME \-e JAVA_OPTS="-Xms4g -Xmx4g -XX:+UseZGC -XX:MaxMetaspaceSize=512m -XX:NewSize=2g -XX:MaxNewSize=2g - XX:SurvivorRatio=6 -XX:MaxTenuringThreshold=15 -XX:+AlwaysPreTouch" \$IMAGE_NAME \--spring.profiles.active=test \--lanting.name=张三取值:spring的@value("${lanting.name}")
设置方法三:环境变量参数(IDEA:Environment variables)
# 命令行:Java -jar启动
export SPRING_PROFILES_ACTIVE=prod
set ARGS_1=hello
java -jar xxx.jar;# IDEA启动
Edit Configurations...>>>Modify option>>>Environment variables
添加 SPRING.PROFILES.ACTIVE=test;ARGS_1=hello# Docker启动
docker run -d \
--name $CONTAINER_NAME \
-e JAVA_OPTS="-Xmx2g -Xms2g" \
-e SPRING_PROFILES_ACTIVE=test \
-e ARGS_1=hello \
$IMAGE_NAME
或者使用引号包裹所有KEY-VALUE (等价)
docker run -d \
--name $CONTAINER_NAME \
-e "JAVA_OPTS=-Xmx2g -Xms2g" \
-e "SPRING_PROFILES_ACTIVE=test" \
-e ARGS_1=hello \
$IMAGE_NAME或者合并:
docker run -d \
--name $CONTAINER_NAME \
-e JAVA_OPTS="-Xmx2g -Xms2g -Dspring.profiles.active=prod" \
-e ARGS_1=hello \
$IMAGE_NAME
代码获取:String envVar = System.getenv("ARGS_1"); // 得到 "hello"
其他:比如使用nohup启动jar项目
nohup java -Xms515m -Xmx1024m -jar -Dfile.encoding=UTF-8 demo.jar --spring.profiles.active=prod >/dev/null 2>&1 &