我正在cloudformation模板中的docker容器中自动部署Java应用。我需要为Java崩溃日志设置一个env变量,但是我需要保持每个容器的唯一路径。我无法修改docker映像或dockerfile。
为此,我使用了来自Docker容器的$ HOSTNAME,它足够独特。问题是我不能将其用作通常的docker环境变量,因为它是在容器启动后设置的。解决方法是通过设置env变量并在此之后启动原始入口点来更改入口点。
EntryPoint:
- /bin/sh
- -c
- export JAVA_OPTS="$JAVA_OPTS -XX:HeapDumpPath=/mnt/crashdumps/java_$HOSTNAME.hprof"
&& ./entrypoint.sh
(这是AWS :: ECS :: TaskDefinition的cloudformation YAML模板,但可以在docker cli中表示相同的东西)
在java容器提供程序更改入口点shell脚本的位置之前,它一直运行良好。现在 shell注入在代码中看起来真的很脏,因为我需要检查文件是否存在并且需要更多维护(即,如果入口点路径或文件名将再次更改)。
是否有更好的方法来实现:
答案 0 :(得分:0)
如果您想为Java故障日志动态生成路径,我建议在docker entrypoint脚本本身中动态生成唯一名称。
就像我测试过的一样,并且效果很好。
Firebase
每次我运行此脚本时,都会在生成多个容器时发生。它将以随机名称在androidx
中生成文件。
#!/bin/sh
# Create some random file in /tmp
filename=$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '')
touch /tmp/$filename
cat /tmp/$filename
export filename=$filename
因此,在这种情况下,入口点将在每次调用期间生成一个唯一的名称,因此不需要在/tmp
之前调用任何东西。
希望这会有所帮助。
更新
到目前为止,我了解到您想覆盖Java故障日志的文件路径,而无需编辑dockerfile或入口点脚本。如果我是对的,则$ ls /tmp/
DzJXInMvJAgvN f0rgIMIt115h7 sSgVDXj2zvRTh x4dBEciezQnix
的{{1}}选项。
您可以尝试
docker entrypoint
您会看到-XX:HeapDumpPath
被适当的文件名覆盖。
希望这会有所帮助,让我知道。