docker-compose.yamlで「$${!}待機」とはどういう意味ですか?

docker-compose.yamlで「$${!}待機」とはどういう意味ですか?

LetsEncryptとnginxを使用してDockerを実行しています。次のチュートリアルには、12時間ごとに証明書を検証できるcertbotコンテナのコマンドが含まれています。

/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'

私はしばらくbashをしてきましたが、wait $${!}このようなことを見たことがありませんか?どういう$${!}意味ですか?

編集する: このコマンドはdocker-compose.yamlの一部なので、コマンド全体は次のようになります。

entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h & wait $${!}; done;'"

答え1

使用されているYAMLファイルでは、docker-compose単一のリテラルを$として書く必要があります$$。コマンドを実行すると、ダブルドル記号は単一のドル記号に変わり、$シェルコマンドは最後に開始されたバックグラウンドジョブと${!}同じプロセスIDを使用します。$!

構文は次のとおり$$です。ここに録音してください:

$$構成にリテラルドル記号が必要な場合(ダブルドル記号)を使用できます。これにより、Composeが値を補間するのを防ぎ、Composeが$$処理したくない環境変数を参照できます。

これは実際にbash。これは、ComposeがYAML文書を処理する方法に関するものです。


バックグラウンドジョブの使用はwaitまったく必要ありません。代替的で同等のコマンドは次のとおりです。

/bin/sh -c 'trap exit TERM; while :; do certbot renew; sleep 12h; done;'

waitsleepコマンド内で実行されるバックグラウンドジョブ()を除いて、実際には何も起こらないため、元のコマンドと同じ効果があります。

答え2

  • この変数には、$!実行したばかりのプロセスのプロセスID(PID)が含まれています。
  • wait $!プロセスが完了するまで待ちます。
  • sleep 12h &sleep 12hバックグラウンドで実行されます。

したがって、このシェルスクリプトはバックグラウンドでスリープモードを実行し、完了するのを待ちます。

$!フォアグラウンドでスリープモードが実行されない理由と、変数名がなぜそんなに奇妙に書かれているのかわかりません。

関連情報