Docker 컨테이너에서 실행되는 하위 프로세스의 출력을 Docker 로그에 기록하는 방법에 대해 알아보겠습니다.
2>
는 표준 에러(stderr)를 리다이렉트하는 명령어입니다. 여기서 2는 파일 디스크립터 번호로, 표준 에러를 나타냅니다. 이를 통해 에러 메시지를 특정 위치로 보낼 수 있습니다.
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"
로그의 가독성을 높이기 위해 각 줄에 헤더를 추가할 수 있습니다. 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 작업이나 백그라운드 프로세스의 로그를 추적할 때 유용합니다.