nohup ...&가 docker 스크립트에서 예상대로 작동하지 않습니다.

nohup ...&가 docker 스크립트에서 예상대로 작동하지 않습니다.

다음과 같은 간단한 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 -tDocker는 컨테이너의 터미널을 에뮬레이트하므로 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.

관련 정보