【问题标题】:Date is not being read in Dockerfile ENTRYPOINT未在 Dockerfile ENTRYPOINT 中读取日期
【发布时间】:2021-12-17 20:14:11
【问题描述】:

第一次出现的问题很好,但是接下来它无法写入具有相同名称的文件,所以我尝试添加 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。甚至其他环境变量也没有被选中。所以我正在尝试第一种方法,只是我需要帮助在文件名中附加时间戳。

【问题讨论】:

  • According to this document,shell 处理不会以 exec 形式发生。因此,有必要明确规定如何执行。
  • 在 Exec 形式的文件名中附加时间戳的替代方法是什么?
  • 你可以尝试在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"]运行java
  • @AKASHKESHARI 除了 rzlvmp 提供的非常好的答案,我还写了另一个替代方案。

标签: docker dockerfile environment-variables docker-entrypoint


【解决方案1】:

尽管推荐使用 exec 形式,但在这种情况下,由于格式复杂,因此创建并执行了单独的 shell 脚本。

测试环境不包含java环境,配置为在运行容器时将参数传递给exec表单。

[Dockerfile]

FROM ubuntu

COPY ./entrypoint.sh /

RUN chmod +x /entrypoint.sh

ENTRYPOINT ["/entrypoint.sh"]

[入口点.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    相关资源
    最近更新 更多