首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我使用dockerfile和dockerfile创建javaproject时,如何更改堆大小?

当我使用dockerfile和dockerfile创建javaproject时,如何更改堆大小?
EN

Stack Overflow用户
提问于 2021-10-26 07:17:40
回答 2查看 1K关注 0票数 0

我想用坞-组成来缩放堆大小,当我需要的时候,我失败了,我需要你的帮助,拜托!

  • Dockerfile:
代码语言:javascript
运行
复制
FROM openjdk:8-jdk
MAINTAINER whywhathow(whywhathow.fun@gmail.com)
ENV \
JVM_GC="UseParallelGC"\
JVM_XMS="128m" \
JVM_XMX="256m"  \
NACOS_ADDR="127.0.0.1:8848" \
JAVA_OPTS="-Xms${JVM_XMS} -Xmx${JVM_XMX}-XX:+${JVM_GC} -Djava.security.egd=file:/dev/./urandom"\
PARAMS="--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.server-addr=${NACOS_ADDR} --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
COPY ./*.jar /app.jar
#EXPOSE 8080
ENTRYPOINT ["/bin/sh","-c","java  ${JAVA_OPTS} -jar app.jar ${PARAMS}"]
  1. docker-compose.yml
代码语言:javascript
运行
复制
version: '3'
services:
  ruoyi-gateway:
    build:
      context: ./service/gateway/
    container_name: ruoyi-gateway
    image: ruoyi-gateway
    ports:
      - "8080:8080"
    environment:
      JVM_XMS: 256m
      JVM_XMX: 256m
      JVM_GC: UseG1GC

所以,我相信我的配置文件可以工作。我错了,我发现问题,错误信息作为列表:

代码语言:javascript
运行
复制
       "Mounts": [],
        "Config": {
            "Hostname": "7a5862c10b9b",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "ExposedPorts": {
                "8080/tcp": {}
            },
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "JVM_XMS=256m",
                "JVM_XMX=256m",
                "JVM_GC=UseG1GC",
                "PATH=/usr/local/openjdk-8/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
                "JAVA_HOME=/usr/local/openjdk-8",
                "LANG=C.UTF-8",
                "JAVA_VERSION=8u312",
                "NACOS_ADDR=121.41.120.209:8848",
                "JAVA_OPTS=-Xms -Xmx-XX:+ -Djava.security.egd=file:/dev/./urandomPARAMS=--server.port=8080 --spring.profiles.active=prod --spring.cloud.nacos.server-addr= --spring.cloud.nacos.config.namespace=prod --spring.cloud.nacos.config.file-extension=yml"
            ],
            "Cmd": null,
            "Image": "ruoyi-gateway",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": [
                "/bin/sh",
                "-c",
                "java  ${JAVA_OPTS} -jar app.jar ${PARAMS}"
            ],

码头信息

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2021-11-06 14:38:10

谢谢戴维·麦子帮助。根据大卫·梅兹的答案,这是我的答案。

  1. 我的苍蝇结构:
代码语言:javascript
运行
复制
-docker
|
--services
|
---demo
|  |-docker-entrypoint.sh
|  |-Dockerfile
|
-docker-compose.yml
  1. Dockerfile作为列表:
代码语言:javascript
运行
复制
FROM openjdk:8-jdk
MAINTAINER whywhathow(whywhathow.fun@gmail.com)
ENV \
JVM_GC="+UseConcMarkSweepGC"\
JVM_XMS="128m" \
JVM_XMX="256m"  \
SERVER_PORT="8080" \
SPRING_PROFILES_ACTIVE="prod" \
NACOS_ADDR="127.0.0.1" \
JAVA_RANDOM="-Djava.security.egd=file:/dev/./urandom"
RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
COPY ./*.jar /app.jar
#EXPOSE 8080
#ENTRYPOINT ["/bin/sh","-c","java  ${JAVA_OPTS} -jar app.jar ${PARAMS}"]
# test shell
COPY ./docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
ENTRYPOINT ["/docker-entrypoint.sh"]
  1. docker-entrypoint.sh作为列表
代码语言:javascript
运行
复制
#!/bin/bash
# docker-entrypoint.sh
# link: https://stackoverflow.com/questions/69718900/how-can-i-change-heap-size-when-i-use-docker-compose-and-dockerfile-to-create-a
# print debug information
set -ex

#########################################################
# Set JVM memory options if set as environment variables.
#########################################################
if [ -n "${JVM_XMS}" ]; then
  JAVA_OPTS="$JAVA_OPTS -Xms$JVM_XMS "
fi
if [ -n "$JVM_XMX" ]; then
  JAVA_OPTS="$JAVA_OPTS -Xmx$JVM_XMX "
fi
# shellcheck disable=SC1072
if [ -n "$JVM_GC" ]; then
  JAVA_OPTS="$JAVA_OPTS -XX:$JVM_GC"
fi
if [ -n "$JAVA_RANDOM" ]; then
  JAVA_OPTS="$JAVA_OPTS $JAVA_RANDOM"
fi
#########################################################
# set params
#########################################################

# shellcheck disable=SC1073
if [ -n  "$SERVER_PORT" ]; then
    PARAMS="$PARAMS --server.port=$SERVER_PORT "
fi
if [ -n  "$SPRING_PROFILES_ACTIVE" ]; then
    PARAMS="$PARAMS --spring.profiles.active=$SPRING_PROFILES_ACTIVE "
fi
if [ -n  "$NACOS_ADDR" ]; then
    PARAMS="$PARAMS --spring.cloud.nacos.server-addr=$NACOS_ADDR"
fi
if [ -n "$OTHER_PARAMS" ];  then
    PARAMS="$PARAMS $OTHER_PARAMS"
fi
# Then run the main container command.
exec  java $JAVA_OPTS -jar  app.jar $PARAMS
  1. 工匠-合成人:没有变化。

之后,您可以轻松地在docker-compose.yml中管理您的项目详细信息。

提示:如果你是码头和外壳脚本中的新手,那么这里有一些你应该看的东西。

  • Dockfile:新行中没有注释
  • shell:确保您的shell没有错误(不要像我一样忽略编辑器错误信息,这太愚蠢了。) 。
    • 如果-n "JVM_OPTIONS“;则

如果你像我一样在dockerfile和shell scirpt上犯了一个错误,你应该注意你的命令。

代码语言:javascript
运行
复制
docker-compose up demo 

找出你的问题并解决它。最后,谢谢戴维·麦子

票数 0
EN

Stack Overflow用户

发布于 2021-10-26 11:00:26

Dockerfile ENV指令只能引用已经定义的环境变量。如果没有shell hackery,就无法定义依赖于其他变量最终拥有的值的环境变量。

对于JVM堆大小的具体情况,从Java 8 update 131开始,JVM知道如何查看Docker内存限制。在Java 8 update 190中,默认的最大堆大小是可用内存的25%,但是可以更改这一点,例如

代码语言:javascript
运行
复制
ENV JAVA_OPTS="-XX:MaxRAMPercentage=75 ..." # but no -Xmx

并使用docker run -m选项设置容器内存限制。例如,如果设置docker run -m 1g,JVM堆大小将为768 MiB。

如果这不是一个选项,我将通过在执行时设置JVM选项来解决这个问题。编写一个设置$JAVA_OPTS的脚本,然后运行一些作为命令行参数传递给它的命令。

代码语言:javascript
运行
复制
#!/bin/sh
# docker-entrypoint.sh

# Set JVM memory options if set as environment variables.
if [ -n "$JVM_XMS" ]; then
  JAVA_OPTS="$JAVA_OPTS -Xms$JVM_XMS"
fi
if [ -n "$JVM_XMX" ]; then
  JAVA_OPTS="$JAVA_OPTS -Xmx$JVM_XMX"
fi

# Then run the main container command.
exec "$@"

在Dockerfile中,您不需要在默认的JVM选项中设置-Xmx,因为入口点脚本将为您添加它。您确实需要将此脚本命名为Docker ENTRYPOINT

代码语言:javascript
运行
复制
ENV ... \
    JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom" \
    ...
COPY docker-entrypoint.sh /
ENTRYPOINT ["/docker-entrypoint.sh"]         # must be JSON array form
CMD java ${JAVA_OPTS} -jar app.jar ${PARAMS} # Docker inserts `sh -c`

我还可以考虑对各种Spring设置使用环境变量而不是命令行参数。Spring接受这两种方法,但是增量地设置单个环境变量要比尝试重写$PARAMS列表容易得多。

代码语言:javascript
运行
复制
ENV ... \
    SERVER_PORT=8080 \
    SPRING_PROFILES_ACTIVE=prod \
    ...
CMD java $JAVA_OPTS -jar app.jar # without $PARAMS

最后一个变体是,如果需要将某些东西作为常规的参数传递,则可以将应用程序调用嵌入到入口点脚本中。这使得获得一个调试shell (docker run --rm -it your-image bash)这样的事情变得更加困难,但是在不重复java命令(docker run -d your-image --option)的情况下,传递参数就更容易了。在此设置中,您将使用java命令结束入口点脚本,中继传递给该脚本的所有参数

代码语言:javascript
运行
复制
exec java $JAVA_OPTS -jar app.jar "$@"

您不需要在Dockerfile中提到java命令,但是您需要详细说明CMD中的选项,该选项必须是JSON-数组形式(数组项的一个选项)。不能在此设置中使用环境变量或其他shell替换。

代码语言:javascript
运行
复制
# if this runs `java -jar app.jar`
ENTRYPOINT ["/docker-entrypoint.sh"]
# then include additional options here -- MUST be a JSON array
CMD ["--server.port=8080", "--spring.profiles.active=prod"]
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69718900

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档