ここでの目的は、Docker コンテナーを安全なサンドボックスとして使用して、信頼されていない Python スクリプトを実行することですが、docker-py モジュールを使用して Python 内から実行し、そのスクリプトの出力をキャプチャできるようにすることです。
docker コンテナー内で python スクリプト foo.py を実行しています ( ENTRYPOINT
Dockerfile でコマンドとして設定されているため、コンテナーが実行されるとすぐに実行されます)、そのスクリプトの出力をキャプチャできません。を使用して通常の 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 によって正しく取得されます。