0

我在 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. 只注入一个“导出”命令并运行原始入口点,无论名称和路径是什么?
4

1 回答 1

0

如果您想要为您的 java 崩溃日志动态生成路径,我建议您在 docker 入口点脚本本身中动态生成唯一名称。

就像这个,我测试过并且工作正常。

#!/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具有随机名称的文件。

$ ls /tmp/
DzJXInMvJAgvN  f0rgIMIt115h7  sSgVDXj2zvRTh  x4dBEciezQnix

因此在这种情况下,入口点将在每次调用期间生成一个唯一名称,因此无需在docker entrypoint.

希望这可以帮助。

更新

到目前为止,我了解您想要覆盖 java 崩溃日志的文件路径,而不编辑 dockerfile 或入口点脚本。如果我是对的-XX:HeapDumpPath选项。JAVA_OPTS

你可以试试这个

$ docker run -itd --env JAVA_OPTS="$JAVA_OPTS -XX:HeapDumpPath=/mnt/crashdumps/java_$(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 13 ; echo '').hprof" alpine sh
$ docker exec -it 75f062ff8906 env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=75f062ff8906
TERM=xterm
JAVA_OPTS= -XX:HeapDumpPath=/mnt/crashdumps/java_MyRZcSKxFtZaF.hprof
HOME=/root

如您所见JAVA_OPTS,它被适当的文件名覆盖。希望这有帮助,让我知道。

于 2019-06-19T12:07:00.637 回答