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(큰 로그를 볼 때와 마찬가지로).

최상의 시나리오에서 달성하고 싶은 것은 첫 번째 +로 다음을 중단 하고 Ctrl두 번째 + 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

관련 정보