0

cloudformation テンプレートの docker コンテナーで Java アプリのデプロイを自動化しています。Java クラッシュ ログの環境変数をセットアップする必要がありますが、コンテナーごとに一意のパスを保持する必要があります。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 コンテナ プロバイダがエントリポイント シェル スクリプトの配置を変更するまでは問題なく動作していました。ファイルが存在するかどうかを確認する必要があり、さらにメンテナンスが必要なため (つまり、エントリポイントのパスまたはファイル名が再度変更される場合) 、シェル インジェクションはコード内で非常に汚れているように見えます。

次のいずれかのより良い方法はありますか?

  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

お役に立てれば。

アップデート

これまでのところ、dockerfile またはエントリポイント スクリプトを編集せずに、Java クラッシュ ログのファイルパスをオーバーライドしたいということを理解しています。私が正しいかどうかの-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 に答える