Docker 如何通过openjdk:8-jdk-alpine中的Maven_OPTS设置Maven-ignoreing-Xmx?
我一辈子都不明白为什么Docker 如何通过openjdk:8-jdk-alpine中的Maven_OPTS设置Maven-ignoreing-Xmx?,docker,maven,alpine,Docker,Maven,Alpine,我一辈子都不明白为什么MAVEN_OPTS中的-Xmx对openjdk:8-jdk-alpine中的MAVEN不起作用 这: 产生: Error occurred during initialization of VM Initial heap size set to a larger value than the maximum heap size 我已经使用-XX:+PrintFlagsFinal查看了具有各种设置的MaxHeapSize,以下是我的发现: 显然,-Xmx被固定为512m
MAVEN_OPTS
中的-Xmx
对openjdk:8-jdk-alpine
中的MAVEN不起作用
这:
产生:
Error occurred during initialization of VM
Initial heap size set to a larger value than the maximum heap size
我已经使用-XX:+PrintFlagsFinal
查看了具有各种设置的MaxHeapSize
,以下是我的发现:
- 显然,
被固定为512mb,不管指定了什么。其他选项,如-Xmx
和-Xms
按预期工作:-XX:+PrintFlagsFinal
$ docker run --rm openjdk:8-jdk-alpine sh -c 'apk add maven && \ MAVEN_OPTS="-Xmx123m -Xms123m -XX:+PrintFlagsFinal" mvn --version | egrep "(Initial|Max)HeapSize"' uintx InitialHeapSize := 130023424 {product} uintx MaxHeapSize := 536870912 {product}
正在安装maven版本apt add maven
,但尝试使用其他版本也会产生相同的结果。例如,Alpine 3.10中的3.6.0-r0
和Alpine 3.7中的3.6.1-r0
产生了相同的结果:3.5.2-r0
$ docker run openjdk:8-jdk-alpine sh -c 'sed -e s:/v3.9/:/v3.10/: /etc/apk/repositories -i && \ apk add maven && MAVEN_OPTS=-Xmx2g\ -XX:+PrintFlagsFinal mvn -version | fgrep MaxHeapSize'
- 我已经查找了中提到的
和~/.m2/settings.xml
,但它们似乎都不存在:/.mvn
$ docker run --rm openjdk:8-jdk-alpine sh -c 'apk add maven && ls ~/.m2'
似乎支持java
很好:-Xmx
$ docker run --rm openjdk:8-jdk-alpine sh -c 'java -Xmx2g -XX:+PrintFlagsFinal -version | fgrep MaxHeapSize'
- 如果使用
而不是maven:3.6.0-jdk-8-alpine
,则不会出现问题:openjdk:8-jdk-alpine
$ docker run --rm maven:3.6.0-jdk-8-alpine sh -c \ 'MAVEN_OPTS=-Xmx2g\ -XX:+PrintFlagsFinal mvn --version | fgrep MaxHeapSize'
- 使用
而不是\u JAVA\u选项
可以作为一种解决方法:MAVEN\u选项
$ docker run --rm openjdk:8-jdk-alpine sh -c 'apk add maven && \ _JAVA_OPTIONS=-Xmx2g\ -XX:+PrintFlagsFinal mvn --version | fgrep MaxHeapSize'
问题是,对于
openjdk:8-jdk-alpine
,如何忽略MAVEN\u OPTS中的-Xmx
。基本上,Alpine Linux上的Maven打包了一个包含以下行的/etc/mavenrc
文件:
M2_HOME="$m2_home"
MAVEN_OPTS="\$MAVEN_OPTS -Xmx512m"
问题在于第二行硬编码-Xmx
到512m。因此,是的,-Xmx
在撰写本文时无法通过Alpine Linux的vanilla MAVEN上的MAVEN_OPTS
进行设置
要进行测试,只需删除该文件并重试:
$ docker run --rm openjdk:8-jdk-alpine sh -c 'apk add maven && rm /etc/mavenrc && \
MAVEN_OPTS=-Xmx2g\ -XX:+PrintFlagsFinal mvn --version | fgrep MaxHeapSize'
MaxHeapSize
然后应设置为所需的2g
bug报告已经发布了三年,可能还没有获得更多的关注,因为有两个条件需要满足:在Alpine Linux上使用Maven,并且需要超过512m的构建
偶然发现这一点的人几乎没有选择:
- 使用
\u JAVA\u OPTIONS
而不是MAVEN\u OPTS
设置-Xmx
- 删除第二行
/etc/mavenrc
希望对他们来说,OOM错误会很快出现并且不会带来痛苦,而不是由于过度GC而导致的极慢的构建。这篇文章中记录了这个模糊的问题。基本上,Alpine Linux上的Maven打包了一个包含以下行的/etc/mavenrc
文件:
M2_HOME="$m2_home"
MAVEN_OPTS="\$MAVEN_OPTS -Xmx512m"
问题在于第二行硬编码-Xmx
到512m。因此,是的,-Xmx
在撰写本文时无法通过Alpine Linux的vanilla MAVEN上的MAVEN_OPTS
进行设置
要进行测试,只需删除该文件并重试:
$ docker run --rm openjdk:8-jdk-alpine sh -c 'apk add maven && rm /etc/mavenrc && \
MAVEN_OPTS=-Xmx2g\ -XX:+PrintFlagsFinal mvn --version | fgrep MaxHeapSize'
MaxHeapSize
然后应设置为所需的2g
bug报告已经发布了三年,可能还没有获得更多的关注,因为有两个条件需要满足:在Alpine Linux上使用Maven,并且需要超过512m的构建
偶然发现这一点的人几乎没有选择:
- 使用
\u JAVA\u OPTIONS
而不是MAVEN\u OPTS
设置-Xmx
- 删除第二行
/etc/mavenrc
希望对他们来说,OOM错误会很快出现,而且不会带来痛苦,而不是由于过度GC而导致的极慢的构建。MAVEN_OPTS
是MAVEN的环境变量,而不是通过docker run使用的JDK--rm openjdk:8-JDK-alpine..
如果您使用的是imagedocker run--rm MAVEN:3.6.0-JDK-8-alpine
,这是一个MAVEN映像,您可以通过-e MAVEN_OPTS=“…”
(作为环境变量)定义。。。其中不需要使用sh-c'MAVEN_OPTS=-Xmx2g \-XX:+PrintFlagsFinal mvn--version..
…MAVEN_OPTS
a设置JVM选项,例如-Xmx
。我可以像你说的那样通过docker run的-e
或者通过shell的VAR=value cmd
语法来设置它,但是这对mvn
没有什么影响,是吗?就这个问题而言,这似乎没有什么意义,但如果我打算使用shell来执行apk add maven
,那么为什么不把它放在命令前面呢,因为这样比较短。你似乎误解了我的观点:maven_OPTS通常不是设置JVM选项的标准方法,而是为用户使用的JVM设置JVM选项的方法Maven(从技术上讲,它是由mvn
scriptto使用的)。通过docker run-e MAVEN_OPTS.使用将仅适用于MAVEN映像(MAVEN:3.6.0-jdk-8-alpine
)但不是针对openjdk:8-jdk-alpine
图像,当然,如果使用不同的图像,行为会发生变化。我认为该评论指出了问题中某些代码存在问题,但我不知道是哪一部分。docker run-e MAVEN_OPTS=…
语法首先出现在您的注释中,问题中的所有代码都使用MAVEN_OPTS=。。。mvn
语法,其中MAVEN_OPTS
直接进入mvn
脚本。MAVEN_OPTS
是MAVEN的环境变量,而不是通过docker run--rm openjdk:8-JDK-alpine..
使用图像docker run--rm MAVEN:3.6.0-JDK-8-alpine
使用的JDK您可以通过-e MAVEN_OPTS=“…”
(作为环境变量)简单定义的图像。。。其中不需要使用sh-c'MAVEN_OPTS=-Xmx2g \-XX:+PrintFlagsFinal mvn--version..
…MAVEN_OPTS
a设置JVM选项,例如-Xmx
。我可以像你一样通过docker run的-e
设置它