当前位置: 首页 > ops >正文

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 &

http://www.xdnf.cn/news/15156.html

相关文章:

  • super task 事件驱动框架
  • 用AI做带货视频评论分析【Datawhale AI 夏令营】
  • 冒泡排序和快速排序
  • 「Linux命令基础」文本模式系统关闭与重启
  • 【C/C++】动态内存分配:从 C++98 裸指针到现代策略
  • Linux操作系统之进程间通信:命名管道
  • 飞算JavaAI:给Java开发装上“智能引擎”的超级助手
  • vue入门学习教程
  • 车载诊断进阶篇 --- 关于网关转发性能引起的思考
  • 匿名函数作递归函数引用
  • uniapp制作一个视频播放页面
  • C++11中的std::minmax与std::minmax_element:原理解析与实战
  • WIFI协议全解析06:Beacon帧、Probe帧你必须懂,搞WiFi通信绕不开它们
  • 【理念●体系】Windows AI 开发环境搭建实录:六层架构的逐步实现与路径治理指南
  • SEQUENCE在RAC多实例开启CACHE的NEXTVAL数值乱序问题
  • 从代码学习深度强化学习 - PPO PyTorch版
  • Go语言WebSocket编程:从零打造实时通信利器
  • Linux操作系统从入门到实战:怎么查看,删除,更新本地的软件镜像源
  • 蔚来测开一面:HashMap从1.7开始到1.8的过程,既然都解决不了并发安全问题,为什么还要进一步解决环形链表的问题?
  • Spring的事务控制——学习历程
  • HarmonyOS NEXT端云一体化开发初体验
  • [Dify] -基础入门4-快速创建你的第一个 Chat 应用
  • 牛客:HJ17 坐标移动[华为机考][字符串]
  • Leaflet面试题及答案(1-20)
  • [实战]调频三角波和锯齿波信号生成(完整C代码)
  • 深入浅出:什么是MCP(模型上下文协议)?
  • 力扣网编程134题:加油站(双指针)
  • C++中柔性数组的现代化替代方案:从内存布局优化到标准演进
  • Debian:从GNOME切换到Xfce
  • 扫描文件 PDF / 图片 纠斜 | 图片去黑边 / 裁剪 / 压缩