Ho un'applicazione Spring Boot che implementa un servizio che voglio eseguire in un contenitore Docker. Ho seguito la linea guida del funzionario Spring docs che suggeriscono di creare un DockerFile simile a questo:Limitare il consumo di memoria JVM in un contenitore 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"]
Poi una volta che l'immagine è spinto a Docker Io uso Docker Compose di lanciare in questo modo:
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'
Qui ho la variabile JAVA_OPTS
che limita l'allocazione di memoria, tuttavia, quando eseguo docker stats spring-boot-docker
, la memoria presa dal contenitore è eccessiva (ho capito che la memoria totale presa dalla JVM potrebbe essere molto più di 64M, ma in questo il caso è totalmente senza limiti).
Ho anche provato con il mem_limit
param, ma questo rallenta notevolmente l'applicazione.
Si noti che il passaggio dalla forma _exec_ a _shell_ di 'ENTRYPOINT' ha anche l'effetto collaterale della disattivazione di {' CMD', argomenti della riga di comando} in modo da eseguire il contenitore come 'finestra mobile run --spring.profiles.active = production' ignorerà semplicemente il profilo. –
qerub