我想在需要時使用 docker-compose 來縮放堆大小,我失敗了,我需要你的幫助,拜託!!!
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}"]
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] 删除。
我来说两句