限制Docker容器中的JVM内存消耗

我有一个Spring Boot应用程序实现了我想在Docker容器中运行的服务。 我遵循了官方Spring文档的build议创buildDockerFile类似于这样的指南:

FROM frolvlad/alpine-oraclejdk8:slim VOLUME /tmp ADD gs-spring-boot-docker-0.1.0.jar app.jar RUN sh -c 'touch /app.jar' ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"] 

然后,一旦图像被推送到Docker,我使用Docker Compose以这种方式启动它:

  spring-boot-docker: ports: - "80:80" expose: - "80" image: my-repo/spring-boot-docker:0.1.0-SNAPSHOT container_name: spring-boot-docker environment: JAVA_OPTS: '-Xmx64m' 

在这里我有JAVA_OPTSvariables限制内存分配,但是,当我执行docker stats spring-boot-docker ,容器占用的内存过多(我明​​白JVM占用的内存可能远远多于64M,但在这种情况下是完全无限的)。

我也尝试了mem_limit参数 ,但是这会显着减慢应用程序的速度。

经过一段时间的努力,似乎JAVA_OPTSvariables可以在Tomcat映像中传递给容器,但Spring Boot使用Java本身作为基础映像。

我发现这个教程解决了我的问题,只是修改DockerFile中的进程的方式,并直接在入口点添加一个JAVA_OPTSvariables:

 ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar 

这样,JVM就会从命令本身中select值。