我有一个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,但这会显着降低应用程序的速度。
答案 0 :(得分:7)
经过一段时间的努力,似乎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将从命令本身中选择值。