sub process의 stdout을 Docker log에 출력하기

Karoid·2024년 10월 14일
0

DevOps

목록 보기
3/3

Docker 컨테이너에서 실행되는 하위 프로세스의 출력을 Docker 로그에 기록하는 방법에 대해 알아보겠습니다.

1. 2>의 의미

2>는 표준 에러(stderr)를 리다이렉트하는 명령어입니다. 여기서 2는 파일 디스크립터 번호로, 표준 에러를 나타냅니다. 이를 통해 에러 메시지를 특정 위치로 보낼 수 있습니다.

2. Docker 로그에 출력하기

Docker 컨테이너의 주 프로세스(PID 1)의 표준 출력으로 로그를 보내면, Docker 로그 시스템에서 이를 캡처할 수 있습니다. 이를 위해 다음과 같은 명령어를 사용할 수 있습니다:

command 2>&1 > /proc/1/fd/1

이 명령어는 표준 에러(2)를 표준 출력(1)으로 리다이렉트한 후, 전체 출력을 PID 1 프로세스의 표준 출력으로 보냅니다. 이렇게 하면 하위 프로세스의 모든 출력이 Docker 로그에 기록됩니다(참고).

예를 들어, 다음 명령어를 사용하여 컨테이너 로그에 "hello" 문자열을 출력할 수 있습니다:

docker exec CONTAINER_NAME /bin/bash -c "echo hello &>> /proc/1/fd/1 & exit"

3. 로그에 헤더 추가하기

로그의 가독성을 높이기 위해 각 줄에 헤더를 추가할 수 있습니다. sed 명령어를 사용하면 이를 쉽게 구현할 수 있습니다:

command 2>&1 | sed 's/^/[CRON] /' > /proc/1/fd/1

이 명령어는 모든 출력 줄의 시작에 [CRON]이라는 헤더를 추가합니다. 이를 통해 로그에서 특정 프로세스의 출력을 쉽게 식별할 수 있습니다.

헤더 추가 전후의 로그 출력 예시:

헤더 추가 전:

Running script1
Running script2
Completed successfully

헤더 추가 후:

[CRON] Running script1
[CRON] Running script2
[CRON] Completed successfully

이러한 방법을 사용하면 Docker 컨테이너 내의 모든 프로세스의 출력을 효과적으로 관리하고 모니터링할 수 있습니다. 특히 cron 작업이나 백그라운드 프로세스의 로그를 추적할 때 유용합니다.

profile
Backend. Rails, MongoDB 강좌를 운영하고 있습니다

0개의 댓글