2017-03-22 2 views
3

:고정 표시기 실행, 고정 표시기 간부와 내가 할 경우 로그

docker run --name nginx -d nginx:alpine /bin/sh -c 'echo "Hello stdout" > /dev/stdout' 

내가 할 때 내가 "안녕하세요 표준 출력을"볼 수 있습니다

docker logs nginx 

그러나 컨테이너가 실행되고 (고정 표시기 실행 - nginx를 -d의 nginx 이름 : 고산) 내가 할 :

:

docker exec nginx /bin/sh -c 'echo "Hello stdout" > /dev/stdout' 

또는 난과 용기를 연결할 때

docker exec -it nginx /bin/sh 

한 다음 :

echo "Hello stdout" > /dev/stdout 

나는 고정 표시기 로그에서 아무것도 볼 수 없습니다. 그리고 내 Nginx 액세스 로그는/dev/stdout으로 리디렉션되기 때문에 볼 수 없습니다.

이 stdout에서 현재 무슨 일이 일어나고 있습니까?

답변

1

당신이 docker exec 때 당신은에/proc 디렉토리/PID /, 여러 과정 / # ps -ef PID USER TIME COMMAND 1 root 0:00 nginx: master process nginx -g daemon off; 6 nginx 0:00 nginx: worker process 7 root 0:00 /bin/sh 17 root 0:00 ps -ef /#

와 리눅스에서, 각 프로세스는 자신의 표준 입력, 표준 출력, 표준 에러 (및 기타 파일 기술자)가

를 볼 수 있습니다 와 FD

그래서, 당신의 docker exec (PID 7) 당신이 뭔가를 표시

/proc 디렉토리/7/FD/1

,

당신의 nginx 프로세스 (PID 1)을 표시하면서 자신의 출력

은/proc/1/FD/1

+0

이해하기 위해 노력하고있어,하지만 : 1. 문제가 간단한 "고산"과 reproductible입니다 image 2. 오직/dev/stdout이 하나 뿐이므로 그가/proc/xxx/fd/1을 그가 선택해야한다고 생각한다. 내가 틀린가? – Tristan

+0

또한 공식 Nginx 이미지에서 나온 지침이 절대로 작동하지 않는다고 말하는가? # 요청 및 오류 로그를 도커 로그 수집기로 전달 RUN ln -sf/dev/stdout /var/log/nginx/access.log \ \t && ln -sf/dev/stderr /var/log/nginx/error.log – Tristan

+2

좋아, 나는 스스로의 질문에 답할 것이다 : 1. 도커 임원이 주 프로세스가 아닌 셸을 만들 것이라고 생각한다. 2. 아니오, 하나의/dev/stdout뿐 아니라 현재 프로세스에 연결된 동적 장치이다. 3. 컨테이너 안의 파일을 표시하지 않고 액세스 로그와 오류 로그가 모두 표시되는 "docker logs nginx"만 사용하면 지침이 실제로 작동합니다. 지속적 로그가 필요한 경우에는 볼륨 만 사용하십시오. – Tristan