docker-compose, less e SIGINT

1

Eu tenho um script que inicializa um ambiente de teste usando docker-compose . Este script canaliza o stdout misto de muitos contêineres do docker em stdout por menos:

# This is part of a larger script with some setup and teardown.
$ docker-compose up --build | less +F -r

less mostra um comportamento indesejado aqui: ao atingir CTRL-C , docker-compose recebe e desliga-se. O comportamento desejado é apenas interromper o recurso a seguir ( +F ) de less (como ocorre ao exibir, por exemplo, um log grande).

O que eu quero alcançar no caso ideal: Interromper o seguinte com o primeiro CTRL-C e encerrar todo o ambiente de teste no segundo CTRL-C .

Eu brinquei um pouco e tentei as seguintes coisas:

  • Registre um trap 'do_exit' SIGINT que implementaria a lógica acima. No entanto, docker-compose ainda saiu com CTRL-C .
  • Use trap '' SIGINT para capturar SIGNT totalmente. docker-compose no entanto ainda tem o CTRL-C fora do ar.

Outra observação:

Isso funciona em zsh : (trap '' SIGINT && docker-compose up --build | less +F -r) (ele não reage ao SIGINT) A mesma linha se comporta de maneira diferente no bash e é morta pelo SIGINT.

Aqui está o script completo (com bugs) para referência:

#!/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

Alguma solução ou experiência com isso?

-

Edit: Eu também tentei as soluções aqui sem sucesso:

por Sahib 06.03.2018 / 11:04

1 resposta

0

Eu descobri depois de ler isto:

A solução é fazer set -m no início do script. Isso faz com que o bash crie um novo grupo de processos para cada processo, não fazendo com que o SIGINT seja enviado para todos os processos no script.

Para referência, o script fixo se parece com isto:

#!/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
    
por 06.03.2018 / 14:37