使用 docker-compose 和 dockerfile 創建 javaproject 時如何更改堆大小?

為什麼怎麼怎麼

我想在需要時使用 docker-compose 來縮放堆大小,我失敗了,我需要你的幫助,拜託!!!

  • Dockerfile :
FROM openjdk:8-jdk
MAINTAINER whywhathow([email protected])
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
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

所以,我相信我的配置文件可以工作。我錯了,我找到了問題,錯誤消息列表:

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

碼頭工人檢查信息

大衛迷宮

DockerfileENV指令只能引用已定義的環境變量。沒有 shell 黑客,就無法定義依賴於其他變量最終具有的值的環境變量。

對於 JVM 堆大小的特定情況,從 Java 8 更新 131 開始,JVM 知道如何查看 Docker 內存限制。從 Java 8 update 190 開始,默認的最大堆大小是可用內存的 25%,但您可以更改此值,例如

ENV JAVA_OPTS="-XX:MaxRAMPercentage=75 ..." # but no -Xmx

並使用該docker run -m選項設置容器內存限制。docker run -m 1g例如,如果設置JVM 堆大小將為 768 MiB。

如果這不是一個選項,我會通過在執行時設置 JVM 選項來解決這個問題。編寫一個設置 的腳本$JAVA_OPTS,然後運行一些作為命令行參數傳遞給它的命令。

#!/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 中,您不需要設置-Xmx默認的 JVM 選項,因為入口點腳本會為您添加它。您確實需要將此腳本命名為 Docker ENTRYPOINT

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列表容易得多

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命令結束入口點腳本,中繼傳遞給腳本的任何參數

exec java $JAVA_OPTS -jar app.jar "$@"

您不需要java在 Dockerfile 中提及該命令,但您需要在 中拼出選項,該選項CMD必須是 JSON 數組形式(數組項的一個選項)。您不能在此設置中使用環境變量或其他 shell 替換。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用為 jenkins 管道安裝的 maven jdk 和 docker 創建 Dockerfile

如何从Docker,Dockerfile和Docker Compose开始?

Dockerfile:在 CMD 之外創建的文件在使用卷時消失

Docker:除了 docker-compose.yml 之外,如何使用 Dockerfile

docker在dockerfile和docker-compose.yml中使用通用配置

如何防止 docker apache 在 docker-compose up 上創建 http 文件夾

使用 Docker Compose 創建同一服務的多個容器

使用Docker compose传递Dockerfile的参数

使用父目录和dockerfile进行构建时docker-compose生成错误

如何使用 setTimeout 和 useEffect 創建延遲效果?

如何使用包創建左、右和中心框架?

使用 Compose UI 時如何為每個列表項創建單獨的 ViewModel?

如何使用jetpack compose創建可重複使用的按鈕?

如何为 docker-compose 和 DockerFile 设置不同的上下文

当主要 go 文件位于嵌套目录中时,如何解析 dockerfile 和 docker-compose?

Dockerfile,docker-compose和swarm模式生命周期

在 IBM MQ 中創建隊列 (docker compose)

使用 Dockerfile 复制代码或使用 docker-compose 安装卷

如何在Dockerfile中使用docker-compose.yml中的环境变量?

Spotify dockerfile-maven-plugin如何使用“ docker-compose build”?

使用docker-compose时如何将主机用户传递给Dockerfile

我如何告诉我的Dockerfile在docker-compose的RUN命令中使用哪个DNS?

docker-compose:对多个服务使用多个Dockerfile

docker-compose build 根据使用次数构建每个 Dockerfile

使用 docker-compose 或 dockerfile 挂载目录(无需复制)

使用堆棧創建樹

如何使用docker-compose连接php和mysql?

如何使用React和Spring Boot连接docker-compose

如何使用 docker-compose 设置 nginx 和 django?