33

ここでの目的は、Docker コンテナーを安全なサンドボックスとして使用して、信頼されていない Python スクリプトを実行することですが、docker-py モジュールを使用して Python 内から実行し、そのスクリプトの出力をキャプチャできるようにすることです。

docker コンテナー内で python スクリプト foo.py を実行しています ( ENTRYPOINTDockerfile でコマンドとして設定されているため、コンテナーが実行されるとすぐに実行されます)、そのスクリプトの出力をキャプチャできません。を使用して通常の CLI 経由でコンテナーを実行すると、

docker run -v /host_dirpath:/cont_dirpath my_image

(host_dirpathは foo.py を含むディレクトリです) foo.py の予期される出力が stdout に出力されます。これは、キーと値のペアの単なる辞書です。ただし、docker-py モジュールを使用して Python 内からこれを実行しようとしていますが、何らかの方法でスクリプト出力がlogsメソッドによってキャプチャされていません。私が使用しているpythonコードは次のとおりです。

from docker import Client

docker = Client(base_url='unix://var/run/docker.sock',
              version='1.10',
              timeout=10)

contid = docker.create_container('my_image', volumes={"/cont_dirpath":""})
docker.start(contid, binds={"/host_dirpath": {"bind": "/cont_dirpath"} })

print "Docker logs: " + str(docker.logs(contid))

「Docker logs:」という結果になるだけです-ログには何もキャプチャされておらず、stdoutもstderrもありません(これをテストするためにfoo.py内で例外を発生させようとしました)。

私が求めている結果は foo.py によって計算され、現在、pythonprintステートメントを使用して標準出力に出力されています。これを docker コンテナーのログに含めて、Python 内から読み取ることができるようにするにはどうすればよいですか? または、この出力をコンテナーの外部から別の方法でキャプチャしますか?

どんな助けでも大歓迎です。前もって感謝します!

編集:

docker-py ではまだうまくいきませんが、subprocess.Popen を使用して通常の CLI でコンテナーを実行するとうまくいきます。これを行うと、出力は実際に stdout によって正しく取得されます。

4

2 に答える 2

23

Python はデフォルトで出力をバッファリングするため、この動作が発生しています。

次の例を見てください。

vagrant@docker:/vagrant/tmp$ cat foo.py
#!/usr/bin/python
from time import sleep

while True:
    print "f00"
    sleep(1)

次に、デーモンとして実行されているコンテナーからのログを観察しても、何も表示されません。

vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app dockerfile/python python /app/foo.py)

-uただし、コマンド ライン パラメータを使用して Python バッファ出力を無効にすると、すべてが表示されます。

vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app dockerfile/python python -u /app/foo.py)
f00
f00
f00
f00

PYTHONUNBUFFERED環境変数を注入することもできます。

vagrant@docker:/vagrant/tmp$ docker logs -f $(docker run -d -v $(pwd):/app -e PYTHONUNBUFFERED=0 dockerfile/python python /app/foo.py)
f00
f00
f00
f00

この動作は、-tor--ttyパラメーターなしで実行されているコンテナーのみに影響することに注意してください。

于 2014-06-12T12:05:55.337 に答える