시작 시 쓸모없는 메시지를 많이 출력하는 컨테이너화된 애플리케이션을 배포 중입니다(동일한 메시지가 백만 번 정도 표시되고 아무 것도 변경되지 않음). 이 메시지는 응용 프로그램 구성을 통해 억제할 수 없으며 응용 프로그램 개발은 내 통제 범위를 벗어납니다. 이로 인해 로깅 인프라에 짜증나고 문제가 급증할 수 있습니다. 로깅 인프라의 메시지는 로그를 볼 때만 필터링할 수 있으며, 컨테이너 런타임에서 로깅 스토리지 백엔드로 로그를 전달할 때는 필터링할 수 없습니다.
따라서 내 의도는 foo bar baz
애플리케이션 외부의 컨테이너 진입점 내부를 사용하여 이 메시지를 억제하는 것입니다(다음 예). grep
지금까지 내가 시도한 것은 다음과 같습니다.
#!/bin/bash
set -euxo pipefail
exec myapp --some parameter | grep --line-buffered -v "foo bar baz"
그러나 이는 PID 1 을 대체하지 않으므로 myapp --some parameter
신호가 SIGTERM
올바른 프로세스로 전달되지 않습니다.
$> docker exec -it ep-test ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.1 0.0 18384 3008 pts/0 Ss+ 16:54 0:00 /bin/bash /entrypoint
root 7 0.0 0.0 4540 836 pts/0 S+ 16:54 0:00 myapp --some parameter
root 8 0.0 0.0 11472 964 pts/0 S+ 16:54 0:00 grep --line-buffered -v "foo bar baz"
root 9 0.0 0.0 34412 2668 pts/1 Rs+ 16:54 0:00 ps aux
exec
로 줄이면 exec myapp --some parameter
PID 1이 올바르게 대체됩니다(그러나 출력은 필요에 따라 필터링되지 않습니다).
$> docker exec -it ep-test ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.2 0.0 4540 768 pts/0 Ss+ 16:55 0:00 myapp --some parameter
root 7 0.0 0.0 34412 2796 pts/1 Rs+ 16:55 0:00 ps aux
애플리케이션을 깔끔하게 종료하려면 SIGTERM
(및 기타 알려진 신호)를 에 전달하는 것이 중요합니다 myapp
. 내가 아는 한, 이를 달성하는 가장 쉬운 방법은 PID 1을 exec
.
myapp
grep
그래서 내 질문은 컨테이너로 전송된 신호가 로 전송/전달되는지 확인하면서 with 의 출력을 필터링하는 쉬운 방법이 있습니까 myapp
?
답변1
일반 파이프를 사용하지 않도록 grep과 함께 bash 명명된 파이프(fifo)를 사용해 볼 수 있습니다. 이 구문은 >(cmd)
fifo를 생성하고, cmd
fifo를 표준 입력으로 실행하고, 명령줄에서 fifo의 이름을 대체하므로 /dev/fd/63
앱 명령의 stdout을 해당 fifo로 보낼 수 있습니다 (예: ) >
.
exec myapp --some parameter > >(grep --line-buffered -v "foo bar baz")
공백에 유의하십시오 > >()
.