.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 '' 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