docker-library / docker-library/python

Example Dockerfile should document to run python unbuffered

オープン
#604 コメント 3 件 リアクション 25 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

主要言語
Dockerfile
スター
2.8k
フォーク
1.1k
平均マージ
3日 1時間
マージ済み PR(30日)
1

説明

The example Dockerfile in the Create a Dockerfile in your python App Project section in the image documentation should have

ENV PYTHONUNBUFFERED=1

or add the -u option to

CMD [ "python", "-u", "./your-daemon-or-script.py" ]

From https://docs.python.org/3/library/sys.html#sys.stdout:

When interactive, the stdout stream is line-buffered. Otherwise, it is block-buffered like regular text files. The stderr stream is line-buffered in both cases. You can make both streams unbuffered by passing the -u command-line option or setting the PYTHONUNBUFFERED environment variable.
Changed in version 3.9: Non-interactive stderr is now line-buffered instead of fully buffered.

When running a container non-interactively, no output from the python script or daemon are flushed to stdout until the block buffer is full (generally DEFAULT_BUFFER_SIZE = 8192) or the container terminates. For daemons which do not terminate and which may not have much logging over its lifetime, nothing may be logged at all.

This makes viewing / tailing the container logs in realtime which by default captures stdout problematic, especially when viewing the logs in conjunction with other services.

Example docker-compose.yaml which demonstrates this issue.

---
services:
  demo:
    image: python:3
    command:
      - python
      - -c
      - |
        import time
        for i in range(10):
            print(i)
            time.sleep(1)

No output is written until the container terminates.

It took me a while to figure out what the problem was, believing it was a problem with Docker not flushing logs to the driver (with --log-opt mode=non-blocking) or getting blocked (with --log-opt mode=blocking - the default), until I realised it was a problem specific to Python. Adding changes to the Python image documentation would help users with similar problems. E.g. https://github.com/moby/moby/issues/12447#issuecomment-94416623 and https://stackoverflow.com/questions/29663459/python-app-does-not-print-anything-when-running-detached-in-docker

The Docker Python Guide docs, https://docs.docker.com/language/python/build-images/ should also be updated.

コントリビューションガイド

このリポジトリのコントリビューションガイドは索引されていません

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

content.md の「Create a Dockerfile in your python App Project」にある例から始め、docs.docker.com/language/python/build-images/ の Docker Python Guide を確認してください。両方のドキュメント箇所を更新し、コンテナログ向けのバッファリングされない Python 出力を説明し、選択した例を含め、ガイダンスが引用されている Python の動作と一致するようにしてください。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
dockerfile, python
領域
documentation
issue の種類
ドキュメント
難易度
3/5
見積もり時間
1〜2日
活発さ
停滞
明瞭さ
明確に書かれている
初心者へのやさしさ
50/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。