docker-compose、less、SIGINT

docker-compose、less、SIGINT

.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 '' SIGINTSIGNTを完全にキャプチャするために使用されます。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

この記事を読んだ後、私は次のことを理解します。

解決策は、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

おすすめ記事