다음과 같은 간단한 Dockerfile이 있습니다.
FROM ubuntu:latest
ADD run.sh /run.sh
CMD /run.sh
run.sh에는 이것이 있습니다 (또한 매우 간단합니다)
#!/bin/bash
nohup awk 'BEGIN { while (c++<50) print "y" }' &
sleep 10
bash의 docker에서 스크립트를 실행하면(즉, 대화형 모드에서 bash 명령을 실행하고 스크립트를 실행하면) 제대로 작동합니다. "nohup 모드"로 전환되고 출력이 nohup.out에 올바르게 표시됩니다.
그러나 기본 명령을 사용하여 Docker 컨테이너를 실행하면 /run.sh
출력이 여전히 STDOUT입니다.
내가 뭘 잘못했나요? docker, bash에서는 작동하지만 대화형 모드에서 실행할 때만 작동하는 이유는 무엇입니까?
답변1
nohup
명령이 터미널로 전송되는 경우에만 명령 출력을 리디렉션합니다. 출력이 이미 다른 유형의 파일(예: 일반 파일 또는 파이프)로 이동 중인 경우 nohup
이는 원하는 것으로 간주되며 로 리디렉션되지 않습니다 nohup.out
.
기본적으로 docker run
명령은 소켓을 통해 실행됩니다(호스트 시스템을 가상 환경과 연결 - 이것이 통신 방식입니다). 소켓은 터미널이 아니므로 nohup
리디렉션이 수행되지 않습니다.
를 실행하면 docker run -t
Docker는 컨테이너의 터미널을 에뮬레이트하므로 nohup
로 리디렉션됩니다 nohup.out
. 명령 이름을 전달하지 않으면 docker는 를 사용한 것처럼 작동합니다 docker run -t bash
.
가장 좋은 해결책은 명령의 출력을 선택한 로그 파일로 명시적으로 리디렉션하는 것입니다. stderr를 리디렉션하는 것을 잊지 마세요. 그렇게 하면 그들이 어디로 가는지 알 수 있습니다.
nohup awk 'BEGIN { while (c++<50) print "y" }' >myscript.log 2>&1 &
답변2
저는 Docker에 대해 잘 모르지만nohup
그것은 고유의 마법을 가지고 있습니다명령 출력 리디렉션에 관해 위치에 따라 다른 장소로 안내합니다.그것은출력이 표시됩니다.
자세한 내용은 링크된 답변을 참조하세요. 거기에서 정확한 답변을 찾을 수 있습니다.POSIX 사양nohup
.