三角帆Maven弹簧靴型材 [英] jib-maven spring boot profile
问题描述
在我的springboot项目中,有三个配置文件
In my springboot project, there are three configuration files
application.yml->用于本地开发
application-test.yml->在测试环境中运行
application-prod.yml->在生产环境中运行
application.yml --> used in local development
application-test.yml --> running in a test environment
application-prod.yml --> running in a production environment
pom.xml
...
<properties>
<docker-repository>self-ip:port</docker-repository>
</properties>
...
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>com.google.cloud.tools</groupId>
<artifactId>jib-maven-plugin</artifactId>
<version>1.7.0</version>
<configuration>
<allowInsecureRegistries>true</allowInsecureRegistries>
<from>
<image>openjdk:8-jre-alpine</image>
</from>
<to>
<image>${docker-repository}/${project.groupId}/${project.artifactId}</image>
</to>
<container>
<creationTime>USE_CURRENT_TIMESTAMP</creationTime>
<jvmFlags>
<jvmFlag>$JAVA_OPTS</jvmFlag>
<jvmFlag>-Dfile.encoding=UTF-8</jvmFlag>
<jvmFlag>-XX:+UseG1GC</jvmFlag>
<jvmFlag>-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/gc.log</jvmFlag>
<jvmFlag>-Djava.security.egd=file:/dev/./urandom</jvmFlag>
</jvmFlags>
</container>
</configuration>
</plugin>
</plugins>
</build>
然后推送到我自己的私有docker存储库,没关系
And then push to my self private docker repository, It's OK
mvn -DsendCredentialsOverHttp=true jib:build
在其他计算机上运行
# On my test machine, I want to run like this
docker run --name test-xxx -d \
-p 8080:8080 -p 9080:9080 \
-e JAVA_OPTS="-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9080" \
-v ~/logs:/logs \
self-ip:port/xxx/yyy
# on my production machine, I want to run like this
docker run --name prod-xxx -d \
-p 8080:8080 \
-e JAVA_OPTS="-server -Xms1G -Xmx1G -Dspring.profiles.active=prod" \
-v /mnt/logs:/logs \
self-ip:port/xxx/yyy
我在测试机上运行时失败
When I running on test machine, It's fail
docker container ls -al
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
XXXXXXXXXXXX xxx "java $JAVA_OPTS -Df…" 3 seconds ago Exited (1) 2 seconds ago test-xxx
我的期望是
# test machine
java -Xms256m -Xmx256m -Dspring.profiles.active=test \
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9080 \
-Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-XX:+PrintGCTimeStamps -Xloggc:/logs/gc.log \
-Djava.security.egd=file:/dev/./urandom \
-cp /app/resources:/app/classes:/app/libs/* \
xxx.yyy.MainClass
# production machine
java -server -Xms1G -Xmx1G -Dspring.profiles.active=prod \
-Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc \
-XX:+PrintGCDetails -XX:+PrintGCDateStamps \
-XX:+PrintGCTimeStamps -Xloggc:/logs/gc.log \
-Djava.security.egd=file:/dev/./urandom \
-cp /app/resources:/app/classes:/app/libs/* \
xxx.yyy.MainClass
我应该如何配置它? container --> environment
或dockerClient --> environment
?
我没有在文档中找到任何相关示例,它们都只是一个句子
How should I configure it? container --> environment
or dockerClient --> environment
?
I have not found any relevant examples in the documentation, They are all just a sentence
@Haran,我将<jvmFlag>$JAVA_OPTS</jvmFlag>
修改为JAVA_TOOL_OPTS
并重新推送
Hi @Haran I modified <jvmFlag>$JAVA_OPTS</jvmFlag>
to JAVA_TOOL_OPTS
and repush
并运行测试
docker container rm test-xxx
docker run --name test-xxx -d \
-p 8080:8080 \
-e "JAVA_TOOL_OPTIONS=-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9080" \
ip:port/xx/yy
它也运行失败
$ docker container ls -al
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
XXXXXXXXXXXX xxx "java $JAVA_TOOL_OPTS -Df…" 3 seconds ago Exited (1) 2 seconds ago test-xxx
然后我删除$ JAVA_TOOL_OPTS并重复上面的重推和docker rm & run
,运行成功,但没有自定义环境
and then I remove $JAVA_TOOL_OPTS and repeat the above repush and docker rm & run
, running succesfull, but no customize enviroment
$ docker exec -it test-xxx ps auxf
PID USER TIME COMMAND
1 root 0:05 java -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc -XX:+P
59 root 0:00 ps auxf
$ docker ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xx yy "java -Dfile.encoding=UTF-8 -XX:+UseG1GC '-verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/logs/gc.log' -Djava.security.egd=file:/dev/./urandom -cp /app/resources:/app/classes:/app/libs/* xx.yy.MainClass" 34 seconds ago Up 34 seconds 0.0.0.0:8080->8080/tcp test-xxx
更新2
docker -e ...
命令的引号在内部和外部之间没有区别.
update 2
The quotation mark for the docker -e ...
command is no different between inside and outside.
$ docker run --name test-xxx -d -p 8080:8080 \
-e JAVA_TOOL_OPTIONS="-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9080" \
ip:port/xx/yy
xxxxx
$ docker exec -it test-xxx env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin
HOSTNAME=4a7c5045109b
TERM=xterm
JAVA_TOOL_OPTIONS=-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9080
JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre
JAVA_VERSION=8u212
JAVA_ALPINE_VERSION=8.212.04-r0
LANG=C.UTF-8
HOME=/root
$ docker run --name test-xxx1 -d -p 8081:8080 \
-e "JAVA_TOOL_OPTIONS=-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9080" \
ip:port/xx/yy
xxxx
$ docker exec -it test-xxx1 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin
HOSTNAME=ae333ad8836f
TERM=xterm
JAVA_TOOL_OPTIONS=-Xms256m -Xmx256m -Dspring.profiles.active=test -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=9080
JAVA_HOME=/usr/lib/jvm/java-1.8-openjdk/jre
JAVA_VERSION=8u212
JAVA_ALPINE_VERSION=8.212.04-r0
LANG=C.UTF-8
HOME=/root
$ docker ps --no-trunc
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
xxx ip:port/xx/yy "java -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/gc.log -Djava.security.egd=file:/dev/./urandom -cp /app/resources:/app/classes:/app/libs/* xx.yy.MainClass" 3 minutes ago Up 3 minutes 0.0.0.0:8081->8080/tcp test-xxx1
xx ip:port/xx/yy "java -Dfile.encoding=UTF-8 -XX:+UseG1GC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCTimeStamps -Xloggc:/var/log/gc.log -Djava.security.egd=file:/dev/./urandom -cp /app/resources:/app/classes:/app/libs/* xx.yy.MainClass" 3 minutes ago Up 3 minutes 0.0.0.0:8080->8080/tcp test-xxx
推荐答案
要设置JVM参数,只需在运行时设置JAVA_TOOL_OPTIONS
.实际上,我可以从您的更新中看到您已经尝试过此操作.
For setting JVM parameters, simply set JAVA_TOOL_OPTIONS
at runtime. Actually, I can see from your update that you already tried this.
$ docker run ... -e "JAVA_TOOL_OPTIONS=..."
大多数JVM会自动选择JAVA_TOOL_OPTIONS环境变量,因此您不需要将JAVA_TOOL_OPTIONS
中的内容作为命令行参数传递给java
二进制文件.您可以在计算机上本地(在容器内部或外部)验证此行为:
Most JVMs will automatically pick up the JAVA_TOOL_OPTIONS environment variable, so you don't need to pass what's inside in JAVA_TOOL_OPTIONS
as command-line arguments to the java
binary. You can verify this behavior locally on your machine (either inside or outside a container):
$ JAVA_TOOL_OPTIONS=-Xmx256m java ABCD # no need to pass extra arguments
Picked up JAVA_TOOL_OPTIONS: -Xmx256m
Error: Could not find or load main class ABCD
$ docker run -e "JAVA_TOOL_OPTIONS=-Xmx256m" --entrypoint java openjdk:11 ABCD
Picked up JAVA_TOOL_OPTIONS: -Xmx256m
Error: Could not find or load main class ABCD
Caused by: java.lang.ClassNotFoundException: ABCD
因此,只需在运行时定义JAVA_TOOL_OPTIONS
(并且您已经使用docker run -e
完成了此操作),而不定义<jvmFlags>
或修改<entrypoint>
.
So, just define JAVA_TOOL_OPTIONS
at runtime (and you already did it with docker run -e
), and don't define <jvmFlags>
or modify <entrypoint>
.
最后,它是JAVA_TOOL_OPTIONS
,而不是JAVA_TOOL_OPTS
.
这篇关于三角帆Maven弹簧靴型材的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!