DockerコンテナのHeredocで実行されているスクリプトの終了コードをキャプチャしようとしました。
python:3.7
ロードされたDockerコンテナを起動し、そこでheredocを実行するためにこのコマンドを実行するとします。
docker run -v $PWD:/workspace -w /workspace --rm -i python:3.7 <<-EOF
./script.sh
echo $?
EOF
script.sh
次のように仮定しましょう。
echo 'Before'
exit 1
echo 'After'
実行してみません。
Before
1
予想した通りですが、より正確には
Before
0
次の変数に終了コードを割り当てようとすると
./script.sh
code=$?
echo $code
わかりました:
Before
script.sh
区切り文書内で実行される終了コードを確実にキャプチャする方法は?
コンテナから直接同じコマンドシーケンスを実行すると正常に動作するので、最初は区切り文書内で実行することに関連していると思います。
ベストアンサー1
ここにあるあなたの文書は引用されていません。これは、呼び出しシェルが変数を渡す前に変数を拡張することを意味しますdocker
。
2つの解決策:
はじめにこちらの文書区切り文字の一部を参照して、この資料を参照してください。
docker ... <<-'MY_SCRIPT' ./script.sh echo "$?" MY_SCRIPT
'MY_SCRIPT'
、、、または"MY_SCRIPT"
のすべてのバリエーション\MY_SCRIPT
が機能します('MY'_SCRIPT
など)。実際の区切り文字は単語でなければならず、通常大文字で書かれています。コードを文書化する方法として、リダイレクト文書をさらに説明するために単語を使用します。$
シェルが特定の変数を拡張しないように、リダイレクト文書の文字をエスケープします。docker ... <<-MY_SCRIPT ./script.sh echo "\$?" MY_SCRIPT
この代替ソリューションは、通常、呼び出しシェルで拡張する必要がある変数の組み合わせとそのまま渡す必要がある追加の変数が文書に含まれている場合に使用されます。