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

标签 java docker spring-boot docker-compose

我有一个 Spring Boot 应用程序实现了我想在 Docker 容器中运行的服务。我遵循了官方Spring docs的指导方针建议创建一个类似于这样的 DockerFile:

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_OPTS 变量,它限制了内存分配,但是,当我执行 docker stats spring-boot-docker 时,容器占用的内存过多(我知道JVM占用的总内存可能远远超过64M,但在这种情况下完全是无限的)。

我也试过 mem_limit param ,但这会显着降低应用程序的速度。

最佳答案

经过一段时间的挣扎,JAVA_OPTS变量似乎可以传递给容器when it's based in a Tomcat image ,但 Spring Boot 使用 Java 本身作为基础镜像。

我发现this tutorial这为我解决了这个问题,只需修改在 DockerFile 中启动进程的方式并直接在 ENTRYPOINT 中添加一个 JAVA_OPTS 变量:

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

这样,JVM 将从命令本身中选择值。

关于java - 限制 Docker 容器中的 JVM 内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37490324/

相关文章:

java - 使用 Maven 创建 EAR 文件

containers - 无法设置LVM时的快照选项

node.js - 在 Windows 上找不到 monax 命令

Docker 拉取失败并显示 "failed to register layer: sync ... input/output error"

java - Spring Boot 应用程序中的两个数据源

java - Spring Boot 中永远不会调用 AuthenticationEntryPoint

Java:删除 "Comparable is a raw type"警告

java - 如何将 C++ double 从一个系统发送到另一个发件人 : Winsock Receiver: Java

java - 版本控制静态 Assets 不适用于 Spring Web Flow

java - 在多个类上共享线程安全集