2016-05-27 6 views
5

Dockerコンテナで実行したいサービスを実装しているSpring Bootアプリケーションがあります。画像がドッカーにプッシュされた後、私はそれをこのように起動するDocker Composeを使用するとDockerコンテナでのJVMメモリ消費の制限

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

:私はこれに似たDockerFileを作成することをお勧め公式Spring docsのガイドラインに従ってきた

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で試してみましたが、これはアプリケーションの速度を著しく低下させます。

答えて

6

しばらくの間苦労した後、JAVA_OPTS変数がコンテナwhen it's based in a Tomcat imageに渡されるようですが、SpringブートはJava自体をベースイメージとして使用します。

私はちょうどプロセスはDockerFileに発売された方法を変更するとENTRYPOINTに直接JAVA_OPTS変数を追加して、私のために問題を解決しthis tutorialを発見しました:

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

この方法は、JVMコマンド自体から値を選択します。

+2

'ENTRYPOINT'の_exec_形式から_shell_形式に切り替えると、{' CMD'、コマンドライン引数}を無効にするという副作用があるので、 'docker run --spring.profiles.active = production'はプロファイルを無視します。 – qerub

関連する問題