Dockerfile ENTRYPOINT 中未读取日期
Date is not being read in Dockerfile ENTRYPOINT
问题第一次没问题,但接下来它无法写入同名文件,所以我尝试添加 pod_id 使其唯一,但似乎 pod id 在重新启动时保持不变失败后,尝试将时间戳添加到文件名中,但日期函数被视为字符串,因此每次重新启动时文件名仍然相同,下次不会生成堆转储文件。
ENTRYPOINT ["java","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=mountpath-heapdump/$MY_POD_ID$(date +'%Y-%m-%d_%H-%M-%S')_heapdump.bin","-jar", "/app.jar"])
我也没有双引号:
ENTRYPOINT java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=mountpath-heapdump/$MY_POD_ID$(date +'%Y-%m-%d_%H-%M-%S')_heapdump.bin -jar app.jar
在 POC 中工作正常,但对于我的项目应用程序,环境变量没有反映,spring-profile 未被选中。甚至其他环境变量也没有被选中。所以我正在尝试第一种方法,只是我需要帮助在文件名中附加时间戳。
虽然推荐使用 exec 形式,但在这种情况下,由于格式复杂,因此创建并执行了单独的 shell 脚本。
测试环境不包括 java 环境,并配置为在 运行 连接容器时将参数传递给 exec 形式。
[Dockerfile]
FROM ubuntu
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
[entrypoint.sh]
#!/bin/bash
echo java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=mountpath-heapdump/$POD_ID$(date +$DATE_FORMAT)_heapdump.bin -jar /app.jar
[docker 构建 & 运行]
docker build -t test .
docker run --rm -e POD_ID='POD_ID' -e DATE_FORMAT='%Y-%m-%d_%H-%M-%S' test
输出是...
root@DESKTOP-6Q87NVH:/tmp/test# docker run --rm -e POD_ID='POD_ID' -e DATE_FORMAT='%Y-%m-%d_%H-%M-%S' test
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=mountpath-heapdump/POD_ID2021-11-03_15-02-22_heapdump.bin -jar /app.jar
@rzlvmp 提供的答案对我有用。
您可以尝试 运行 java inside shell ENTRYPOINT ["bash", "-c", "java -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=mountpath-heapdump/$MY_POD_ID$(date +'%Y-%m-%d_%H-%M-%S')_heapdump.bin -jar /app.jar"]
问题第一次没问题,但接下来它无法写入同名文件,所以我尝试添加 pod_id 使其唯一,但似乎 pod id 在重新启动时保持不变失败后,尝试将时间戳添加到文件名中,但日期函数被视为字符串,因此每次重新启动时文件名仍然相同,下次不会生成堆转储文件。
ENTRYPOINT ["java","-XX:+HeapDumpOnOutOfMemoryError","-XX:HeapDumpPath=mountpath-heapdump/$MY_POD_ID$(date +'%Y-%m-%d_%H-%M-%S')_heapdump.bin","-jar", "/app.jar"])
我也没有双引号:
ENTRYPOINT java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=mountpath-heapdump/$MY_POD_ID$(date +'%Y-%m-%d_%H-%M-%S')_heapdump.bin -jar app.jar
在 POC 中工作正常,但对于我的项目应用程序,环境变量没有反映,spring-profile 未被选中。甚至其他环境变量也没有被选中。所以我正在尝试第一种方法,只是我需要帮助在文件名中附加时间戳。
虽然推荐使用 exec 形式,但在这种情况下,由于格式复杂,因此创建并执行了单独的 shell 脚本。
测试环境不包括 java 环境,并配置为在 运行 连接容器时将参数传递给 exec 形式。
[Dockerfile]
FROM ubuntu
COPY ./entrypoint.sh /
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
[entrypoint.sh]
#!/bin/bash
echo java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=mountpath-heapdump/$POD_ID$(date +$DATE_FORMAT)_heapdump.bin -jar /app.jar
[docker 构建 & 运行]
docker build -t test .
docker run --rm -e POD_ID='POD_ID' -e DATE_FORMAT='%Y-%m-%d_%H-%M-%S' test
输出是...
root@DESKTOP-6Q87NVH:/tmp/test# docker run --rm -e POD_ID='POD_ID' -e DATE_FORMAT='%Y-%m-%d_%H-%M-%S' test
java -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=mountpath-heapdump/POD_ID2021-11-03_15-02-22_heapdump.bin -jar /app.jar
@rzlvmp 提供的答案对我有用。
您可以尝试 运行 java inside shell ENTRYPOINT ["bash", "-c", "java -XX:+ HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=mountpath-heapdump/$MY_POD_ID$(date +'%Y-%m-%d_%H-%M-%S')_heapdump.bin -jar /app.jar"]