programing

도커에서 분리 실행 시 Python 앱이 인쇄되지 않음

sourcejob 2022. 10. 14. 21:39
반응형

도커에서 분리 실행 시 Python 앱이 인쇄되지 않음

Python(2.7) 앱이 도커 파일에서 시작되고 있습니다.

CMD ["python","main.py"]

main.py 는, 기동시에 몇개의 문자열을 인쇄해, 그 후에 루프 상태가 됩니다.

print "App started"
while True:
    time.sleep(1)

-it 플래그를 사용하여 컨테이너를 시작하면 모든 것이 예상대로 작동합니다.

$ docker run --name=myapp -it myappimage
> App started

나중에 로그를 통해 동일한 출력을 볼 수 있습니다.

$ docker logs myapp
> App started

-d 플래그를 사용하여 동일한 컨테이너를 실행하려고 하면 컨테이너가 정상적으로 시작되는 것처럼 보이지만 출력이 표시되지 않습니다.

$ docker run --name=myapp -d myappimage
> b82db1120fee5f92c80000f30f6bdc84e068bafa32738ab7adb47e641b19b4d1
$ docker logs myapp
$ (empty)

하지만 컨테이너는 여전히 가동되고 있는 것 같습니다.

$ docker ps
Container Status ...
myapp     up 4 minutes ... 

첨부 파일에도 아무것도 표시되지 않습니다.

$ docker attach --sig-proxy=false myapp
(working, no output)

뭐가 잘못됐는지 알아?백그라운드에서 실행하면 "인쇄"가 다르게 동작합니까?

도커 버전:

Client version: 1.5.0
Client API version: 1.17
Go version (client): go1.4.2
Git commit (client): a8a31ef
OS/Arch (client): linux/arm
Server version: 1.5.0
Server API version: 1.17
Go version (server): go1.4.2
Git commit (server): a8a31ef

마침내 GitHub의 @ahmetalpbalkan over 덕분에 Docker에서 데몬화된 Python 출력을 볼 수 있는 솔루션을 찾았습니다.자세한 참조를 위해 여기에 직접 답변합니다.

버퍼링되지 않은 출력 사용

CMD ["python","-u","main.py"]

대신

CMD ["python","main.py"]

이 문제를 해결합니다.출력(stderr 및 stdout)은, 다음의 순서로 확인할 수 있습니다.

docker logs myapp

지금!

내 경우 Python을 실행하는 것은-u아무것도 변하지 않았어요하지만 비결은 바로 이 장치를PYTHONUNBUFFERED=1환경변수로서:

docker run --name=myapp -e PYTHONUNBUFFERED=1 -d myappimage

[편집] : 갱신 완료PYTHONUNBUFFERED=0로.PYTHONUNBUFFERED=1라스의 코멘트가 있은 후.이것은 동작을 바꾸지 않고 명확성을 높입니다.

이 동작의 상세한 이유에 대해서는, 다음의 문서를 참조해 주세요.

버퍼링에는 보통 다음 3가지 모드가 있습니다.

  • 파일 기술자가 버퍼링 해제된 경우 버퍼링은 전혀 발생하지 않으며 데이터를 읽거나 쓰는 함수 호출이 즉시 발생합니다(차단됩니다).
  • 파일 기술자가 풀 버퍼링된 경우 고정 크기의 버퍼가 사용되며 읽기 또는 쓰기 호출은 버퍼에서 읽기 또는 쓰기만 하면 됩니다.버퍼는 가득 찰 때까지 플러시되지 않습니다.
  • 파일 기술자가 줄 버퍼링되어 있는 경우 버퍼링은 줄바꿈 문자가 표시될 때까지 대기합니다.따라서 데이터는 \n이 표시될 때까지 버퍼링 및 버퍼링되고 버퍼링된 모든 데이터는 그 시점에서 플래시됩니다.실제로는 보통 버퍼에 최대 사이즈가 있기 때문에(완전 버퍼의 경우와 마찬가지로) 규칙은 실제로는 "새로운 행 문자가 표시되거나 4096바이트의 데이터가 발견될 때까지 버퍼링"에 가깝습니다.

또한 GNU libc(glibc)는 버퍼링에 다음 규칙을 사용합니다.

Stream               Type          Behavior
stdin                input         line-buffered
stdout (TTY)         output        line-buffered
stdout (not a TTY)   output        fully-buffered
stderr               output        unbuffered

'를 쓰면-t도커 문서에서 의사 tty를 할당합니다.stdout becomes가 되다line-buffereddocker run --name=myapp -it myappimage는, 1 output.down, 1 행의 output.down, 1 행의 output을 확인할 수 .

그리고, 만약 사용한다면-dtty는 할당되지 않았습니다.stdoutfully-buffered한 줄, " "App started버퍼를 확실히 플러시할 수 없습니다.

이번에는 '어 주세요'를 사용하세요.-dt로로 합니다.make stdout line buffered 「」를 추가합니다.-u에서 python으로 합니다.flush the buffer바로잡을 수 있는 방법이야

【플라스크】를 실행하고 때, .docker-compose up도커 컴포지트 파일에 다음 항목을 추가합니다.

web:
  environment:
    - PYTHONUNBUFFERED=1

https://docs.docker.com/compose/environment-variables/

아직 이 답을 보지 못했기 때문에:

또한 stdout에 인쇄한 후 stdout을 플러시할 수도 있습니다.

import time

if __name__ == '__main__':
    while True:
        print('cleaner is up', flush=True)
        time.sleep(5)

두 .PYTHONUNBUFFERED=1 ★★★★★★★★★★★★★★★★★」PYTHONIOENCODING=UTF-8

는, 됩니다.print로로 합니다.logging.

main.py:

import time
import logging
print "App started"
logging.warning("Log app started")
while True:
    time.sleep(1)

도커 파일:

FROM python:2.7-stretch
ADD . /app
WORKDIR /app
CMD ["python","main.py"]

하고 있는 는 conda python을 추가해야 .--no-capture-output to conda stdout 명령어로 합니다.

ENTRYPOINT ["conda", "run", "--no-capture-output", "-n", "my-app", "python", "main.py"]

빠른 수정으로 다음을 시도해 보십시오.

from __future__ import print_function
# some code
print("App started", file=sys.stderr)

이것은 같은 문제에 직면했을 때 효과가 있습니다.그런데 솔직히 왜 이런 오류가 발생하는지 모르겠어요.

수 ★★★★★★★★★★★★★★★★★★★★★★★.PYTHONUNBUFFERED=1django runserver의 을 확인하려면 docker-dango runserver.합니다.

★★★★★★★★★★★★★★★★를 사용하지 않는 경우는docker-compose 그냥 평범하게docker이것을 '', '아까', '아까', '아까'에 붙여도 돼요.Dockerfile 앱을.

ARG FLASK_ENV="production"
ENV FLASK_ENV="${FLASK_ENV}" \
    PYTHONUNBUFFERED="true"

CMD [ "flask", "run" ]

「」를 사용하고 python manage.py runserver Django PYTHONUNBUFFERED=1내 문제를 해결해라. print('helloworld', flush=True)나한테도 통한다.

★★★★★★★★★★★★★★.python -u나한테는 안 통한다.

통상, 호스트로부터 볼륨을 마운트 해 그 파일에 쓰는 것으로, 특정의 파일로 리다이렉트 합니다.

-tty를 사용하여 tty를 추가하는 것도 좋습니다.도커 로그에서 찾을 필요가 있습니다.

로그 출력이 커서 도커 로그에 넣지 않고 버퍼를 모두 저장하는 데 문제가 없었습니다.

언급URL : https://stackoverflow.com/questions/29663459/python-app-does-not-print-anything-when-running-detached-in-docker

반응형