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
,以下是我的发现:

  • 显然,
    -Xmx
    被固定为512mb,不管指定了什么。其他选项,如
    -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}
    
  • apt add maven
    正在安装maven版本
    3.6.0-r0
    ,但尝试使用其他版本也会产生相同的结果。例如,Alpine 3.10中的
    3.6.1-r0
    和Alpine 3.7中的
    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..
如果您使用的是image
docker 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
设置它