如何在Docker入口点之前透明地运行脚本?

时间:2019-06-19 10:59:20

标签: java amazon-web-services docker amazon-cloudformation docker-entrypoint

我正在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注入在代码中看起来真的很脏,因为我需要检查文件是否存在并且需要更多维护(即,如果入口点路径或文件名将再次更改)。

是否有更好的方法来实现:

  1. 使用与修改入口点不同的方法动态设置带有容器名称的路径;或
  2. 仅插入“导出”命令并运行原始入口点,无论名称和路径是什么?

1 个答案:

答案 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被适当的文件名覆盖。 希望这会有所帮助,让我知道。