2016-05-27 2 views
5

Ich habe eine Spring Boot-Anwendung, die einen Dienst implementiert, den ich in einem Docker-Container ausführen möchte. Ich habe die Richtlinie der offiziellen Spring docs gefolgt, die eine DockerFile ähnlich wie diese erstellen vorschlagen:Begrenzen der JVM-Speicherbelegung in einem Docker-Container

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"] 

Dann, wenn das Bild auf Docker geschoben ich Docker Compose es auf diese Weise zu starten:

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' 

Hier habe ich die JAVA_OPTS Variable, die die Speicherzuweisung begrenzt, jedoch, wenn ich docker stats spring-boot-docker ausführen, ist der vom Container genommene Speicher exzessiv (ich verstehe den gesamten von der JVM genommenen Speicher viel mehr als 64M, aber in diesem Fall ist völlig grenzenlos).

Ich habe auch mit der mem_limit param versucht, aber das verlangsamt die Anwendung spürbar.

Antwort

6

Nach dem Kämpfen für eine Weile scheint es, dass die JAVA_OPTS Variable an den Container when it's based in a Tomcat image übergeben werden kann, aber Spring Boot verwendet Java selbst als Basisbild.

Ich habe this tutorial herausgefunden, was das Problem für mich gelöst, sondern nur die Art und Weise modifiziert das Verfahren in DockerFile gestartet wird und das Hinzufügen einer JAVA_OPTS Variable direkt in der ENTRYPOINT:

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

diese Weise wird die JVM wählt den Wert aus dem Befehl selbst aus.

+2

Bitte beachten Sie, dass der Wechsel von _exec_ zu _shell_ von "ENTRYPOINT" auch den Nebeneffekt hat, {CMD', Befehlszeilenargumente} zu deaktivieren, so dass Ihr Container wie 'docker run --spring.profiles.active ausgeführt wird = production' ignoriert das Profil einfach. – qerub

Verwandte Themen