.NETを使用してテスト環境を起動するスクリプトがありますdocker-compose
。このスクリプトは、lessを介して多くのdockerコンテナの混合stdoutをstdoutにパイプします。
# This is part of a larger script with some setup and teardown.
$ docker-compose up --build | less +F -r
less
ここに示されている誤った動作:Ctrl+をクリックすると+が受信され、それC自体docker-compose
が閉じます。必要な動作は、次の(+F
)機能を中断することですless
(大きなログを表示したときと同じように)。
最良のシナリオで達成したいのは、最初の+で次を中止し、Ctrl2番目の+Cでテスト環境全体を終了することです。CtrlC
少し遊んで、次のことを試しました。
- 登録すると、
trap 'do_exit' SIGINT
上記のロジックが実装されます。しかし、まだdocker-compose
+で終了します。CtrlC trap '' SIGINT
SIGNTを完全にキャプチャするために使用されます。docker-compose
しかし、まだCtrl+は虚空から外れています。C
別の観察:
これは動作しますzsh
:(trap '' SIGINT && docker-compose up --build | less +F -r)
(SIGINTにはまったく反応しません)同じ行はbashで異なる動作をし、SIGINTによって終了します。
参照用の完全な(問題のある)スクリプトは次のとおりです。
#!/usr/bin/env bash
service_name=xxx
for dir in ../1 ../2 ../3; do
if [ ! -d "$dir" ]; then
echo "docker compose requires $dir, please check $dir do exist in the same folder level"
exit 0
fi
done
docker-compose up --build | less +F -r
if [ ! $? -eq 0 ]; then
echo "Couldn't start service or Control-C was pressed"
echo "cleaning up"
docker-compose down
exit $?
fi
docker-compose rm --all --force
これに関して解決策や経験がありますか?
-
編集:私も成功しなかったので、ここで解決策を試しました。
答え1
この記事を読んだ後、私は次のことを理解します。
- https://en.wikipedia.org/wiki/Process_group
- https://www.gnu.org/software/bash/manual/html_node/Job-Control.html#Job-Control
解決策は、set -m
スクリプトの先頭で実行することです。これにより、Bash は SIGINT がスクリプト内の各プロセスに転送されるのではなく、各プロセスに対して新しいプロセスグループを作成します。
参考に変更されたスクリプトは次のとおりです。
#!/usr/bin/env bash
set -m
set -e
service_name=xxx
for dir in ../1 ../2 ../3; do
if [ ! -d "$dir" ]; then
echo "docker compose requires $dir, please check $dir do exist in the same folder level"
exit 0
fi
done
TEMP_LOG_FILE=$(mktemp --suffix '-dev-env-log')
(trap '' SIGINT && docker-compose up --build > ${TEMP_LOG_FILE}) &
less +F -r ${TEMP_LOG_FILE}
rm ${TEMP_LOG_FILE}
echo "Less was quit, stopping containers..."
if [ ! $? -eq 0 ]; then
echo "could not start service or Control-C was pressed"
echo "cleaning up"
docker-compose down
exit $?
fi
docker-compose down
docker-compose rm --all --force