限制 Docker 容器中的 JVM 内存消耗
Limit JVM memory consumption in a Docker container
我有一个 Spring 启动应用程序实现了我想 运行 在 Docker 容器中的服务。我遵循了官方 Spring docs 的指南,该指南建议创建一个类似于此的 Docker 文件:
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,但在这种情况下是完全无限的)。
我也尝试过 ,但这会显着降低应用程序的速度。
纠结了一段时间,似乎可以将JAVA_OPTS
变量传递给容器,但是Spring Boot使用Java本身作为基础镜像.
我发现 this tutorial 解决了我的问题,只需修改在 DockerFile 中启动进程的方式并直接在 ENTRYPOINT 中添加一个 JAVA_OPTS 变量:
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar
这样,JVM 将从命令本身中选取值。
我有一个 Spring 启动应用程序实现了我想 运行 在 Docker 容器中的服务。我遵循了官方 Spring docs 的指南,该指南建议创建一个类似于此的 Docker 文件:
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,但在这种情况下是完全无限的)。
我也尝试过
纠结了一段时间,似乎可以将JAVA_OPTS
变量传递给容器
我发现 this tutorial 解决了我的问题,只需修改在 DockerFile 中启动进程的方式并直接在 ENTRYPOINT 中添加一个 JAVA_OPTS 变量:
ENTRYPOINT exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar
这样,JVM 将从命令本身中选取值。