2016-05-27 9 views
5

Bir Docker kabında çalışmak istediğim bir hizmeti uygulayan bir Spring Boot uygulaması var.Bir Docker kapsayıcısında JVM bellek tüketimi sınırı

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' 
: Görüntü ben bu şekilde başlatmak için Docker Compose kullanmak Docker aktarıldıktan sonra Sonra

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

: Ben buna benzer bir DockerFile oluşturmak önermek resmi Spring docs ait kılavuz izlediyseniz

Burada, bellek ayırmayı sınırlayan JAVA_OPTS değişken var, ancak, docker stats spring-boot-docker çalıştırdığımda, kap tarafından alınan bellek aşırı (JVM tarafından alınan toplam belleğin 64M'den çok daha fazla olabileceğini anlıyorum, ancak bu dava tamamen sınırsızdır).

Ayrıca, mem_limit param ile denedim, ancak bu uygulama dikkat çekecek şekilde yavaşlatır.

cevap

6

Bir süre uğraştıktan sonra, JAVA_OPTS değişkeninin kapsayıcı when it's based in a Tomcat image'a aktarılabildiği görülüyor, ancak Spring Boot temel görüntü olarak Java'yı kendisi kullanıyor.

Sadece süreç DockerFile başlatıldı şeklini değiştirerek ve EntryPoint doğrudan bir JAVA_OPTS değişkeni ekleyerek benim için sorun çözüldü this tutorial öğrendim:

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

Bu şekilde, JVM değeri komutun kendisinden seçer.

+2

_exec_'den _shell_ for 'ENTRYPOINT' seçeneğine geçiş, {'CMD', komut satırı argümanları} işlevinin devre dışı bırakılmasının yan etkisine de sahip olduğundan, kapsayıcınızın çalıştırılması gibi --spring.profiles.active = prodüksiyon 'profili görmezden gelecektir. – qerub