shell 运行时正常的,我手动写入 /etc/profile 运行也是正常的。
但是放在 yml 里面就报错,不想写死在 dockerfile 里面,用 yml 配置灵活些。
shell 命令
java -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/logs/moose-job/gc-$(date +'%Y-%m-%d').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/moose-job/dump-$(date +'%Y-%m-%d').hprof -jar moose-job.jar
Invalid file name for use with -Xloggc: Filename can only contain the characters [A-Z][a-z][0-9]-_.%[p|t] but it has been /data/logs/moose-job/gc-$(date
Note %p or %t can only be used once
Picked up JAVA_TOOL_OPTIONS: -XX:+UseContainerSupport -XX:InitialRAMPercentage=70.0 -XX:MaxRAMPercentage=70.0 -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:/data/logs/moose-job/gc-$(date +'%Y-%m-%d').log -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/data/logs/moose-job/dump-$(date +'%Y-%m-%d').hprof
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.
1
dropdatabase 2023-06-28 15:52:13 +08:00
1.name: JAVA_OPTS
value: -Xms1024m -Xmx1024m -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap 2.java -jar $JAVA_OPTS $APP_JAR -Dfile.encoding=UTF-8 --spring.profiles.active=$1 |
2
aru 2023-06-28 15:53:46 +08:00
$(date +'%Y-%m-%d')
这种方式是不行的 |
3
perfectlife 2023-06-28 15:59:14 +08:00
env:
- name: NAMESPACE valueFrom: fieldRef: fieldPath: metadata.namespace - name: POD_NAME valueFrom: fieldRef: fieldPath: metadata.name - name: POD_IP valueFrom: fieldRef: fieldPath: status.podIP - name: JAVA_TOOL_OPTIONS value: "-XX:MaxRAMPercentage=85.0 -XX:InitialRAMPercentage=85.0 -XX:MinRAMPercentage=85.0 -XX:MetaspaceSize=200m -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/dump/${POD_NAME}-$(POD_IP).hprof 可以参考下这个 |
4
perfectlife 2023-06-28 16:00:04 +08:00
@dunhanson 格式问题自己调整一下
|
5
julyclyde 2023-06-28 16:02:03 +08:00
$()是 shell 的功能。你这里连 shell 都没有
|
6
dunhanson OP |
7
dunhanson OP @perfectlife 哈哈 这个感觉可以
|
8
dunhanson OP |
10
perfectlife 2023-06-28 16:52:40 +08:00
@dunhanson 实际上 dump 没啥用,首先要挂载一个共享存储比如 nfs 来存储 dump 文件,其次我对 oomkill 时候几个 g 的 dump 文件能否正常保存下来还是有点怀疑的 ,真排查 拿阿里的阿尔萨斯取容器里排查好点
|
11
xx6412223 2023-06-29 09:37:27 +08:00
command:
- /bin/sh - -c - xxxxxx 直接把完整的启动命令以 shell 写道 pod command 里 |
12
tudou1514 2023-06-29 10:11:18 +08:00
目前测试好几种后,最好的就是传脚本进容器,然后用 entrypoint 启动
|
13
dunhanson OP |
14
ofblyt 2023-06-29 12:04:09 +08:00
从你的报错信息来看,主要问题在于`-Xloggc`和`-XX:HeapDumpPath`参数中的文件名,你尝试在其中使用了`$(date +'%Y-%m-%d')`这样的 Shell 变量,但这种变量并不能被 Java 虚拟机( JVM )正确地解析。
在 Kubernetes 中,环境变量在 pod 启动时被解析,而不是在运行命令时。这就意味着,你的`$(date +'%Y-%m-%d')`并没有被替换成实际的日期,而是被原样包含在了字符串中。这就导致了你看到的“Invalid file name for use with -Xloggc”的错误。 一种解决方法是,你可以创建一个启动脚本,这个脚本会在运行 Java 程序之前,计算出需要的日期,并将其设置为环境变量。然后,你可以在`JAVA_TOOL_OPTIONS`中使用这个环境变量。 例如,你的启动脚本可能看起来像这样: ```bash #!/bin/sh export LOG_DATE=$(date +'%Y-%m-%d') java $JAVA_TOOL_OPTIONS -jar moose-job.jar ``` 然后在你的`JAVA_TOOL_OPTIONS`中,你可以使用`$LOG_DATE`,例如: ```bash -XX:HeapDumpPath=/data/logs/moose-job/dump-$LOG_DATE.hprof ``` 这样,`$LOG_DATE`就会在运行 Java 程序时被替换为实际的日期。 然后,在你的 Kubernetes 配置中,你需要将启动命令更改为运行这个脚本,而不是直接运行 Java 程序。 |
15
julyclyde 2023-06-29 12:18:37 +08:00
@dunhanson 其实之前你选择用 shell 替换功能给 jvm 传递文件名,存在一个认知问题,就是:loggc 是否自己就支持 logrotate 功能
如果支持,那它自己会决定文件名变更,它需要一个符号化的文件名模板,而不需要你给它传递一个(已经替换为明文的)明文文件名 如果不支持,那你给一个明文文件名,会导致不同时刻启动的各容器内的日志文件名不同,对统一处理造成不便 无论那种,其实都是错的做法 |
16
julyclyde 2023-06-29 12:19:24 +08:00
另外,不要在 profile/shell rc 里放环境变量
我敢说绝大多数正常人都没仔细学过,这俩文件到底在什么情况下生效 |