ゲスト投稿: Python on whales を使用して Python から Docker CLI を呼び出す

ニシキヘビクジラ
画像:アリス・ラング、 [メール保護]

Dockerでは、活気に満ちた多様で創造的なコミュニティを非常に誇りに思っています。 時々、私たちはブログでコミュニティからのクールな貢献を特集し、私たちのコミュニティが行っている素晴らしい仕事のいくつかを強調しています。 以下は、DockerコミュニティメンバーのGabriel de Marmiesseによるゲスト投稿です。 Dockerで何か素晴らしいことに取り組んでいますか? ウィリアム・クイヴィガー(@william)にあなたの貢献を送ってください Docker Community Slack そして、私たちはあなたの作品を特集するかもしれません!   

Docker を呼び出して制御する最も一般的な方法は、コマンド ラインを使用することです。

Docker の使用が増えるにつれ、ユーザーはシェル以外のプログラミング言語から Docker を呼び出したいと考えています。 Python から Docker を使用する一般的な方法の 1 つは、 docker-py を使用することです。 このライブラリは非常に成功 docker-compose しているため、Pythonで書かれており、docker-pyを利用しています。

ただし、docker-pyの目的は、Dockerクライアント(Golangで記述)を複製することではなく、Docker Engine HTTP APIと通信することです。 Dockerクライアントは非常に複雑で、別の言語で複製するのは困難です。 このため、Dockerクライアントにあった多くの機能をdocker-pyで利用できませんでした。 docker-pyがCLIとまったく同じように動作しなかったために、ユーザーがイライラすることがありました。

本日は、Docker コミュニティの Gabriel de Marmiesse 氏が構築した新しいプロジェクト、Python-on-whales を紹介します。 このプロジェクトの目標は、Docker CLI と Python ライブラリを 1 対 1 でマッピングすることです。 これを行うには、Docker Engine HTTP API を直接呼び出すのではなく、Docker CLI と通信します。

ドッカー・クライアント 1

Docker コマンド ラインを呼び出す必要がある場合は、Python on whales を使用します。 また、Docker エンジンを直接呼び出す必要がある場合は、docker-py を使用してください。

この投稿では、docker-pyでは利用できないが、Python-on-whalesで利用できる機能のいくつかを見ていきます。

  • Docker buildx を使用したビルド
  • ドッカースタックを使用したスウォームへのデプロイ
  • Compose を使用したローカル エンジンへのデプロイ

Python-on-whalesをダウンロードすることから始めます 

ピップインストールパイソンオンクジラ

そして、あなたは揺れる準備ができています!

Docker Buildx0

ここでは 、Docker イメージをビルドします。 Python-on-whales はデフォルトで buildx を使用し、リアルタイムで出力を提供します。

>>> from python_on_whales import docker
>>> my_image = docker.build(".", tags="some_name")
[+] Building 1.6s (17/17) FINISHED
 => [internal] load build definition from Dockerfile                       0.0s
 => => transferring dockerfile: 32B                                        0.0s
 => [internal] load .dockerignore                                          0.0s
 => => transferring context: 2B                                            0.0s
 => [internal] load metadata for docker.io/library/python:3.6              1.4s
 => [python_dependencies 1/5] FROM docker.io/library/python:3.6@sha256:293 0.0s
 => [internal] load build context                                          0.1s
 => => transferring context: 72.86kB                                       0.0s
 => CACHED [python_dependencies 2/5] RUN pip install typeguard pydantic re 0.0s
 => CACHED [python_dependencies 3/5] COPY tests/test-requirements.txt /tmp 0.0s
 => CACHED [python_dependencies 4/5] COPY requirements.txt /tmp/           0.0s
 => CACHED [python_dependencies 5/5] RUN pip install -r /tmp/test-requirem 0.0s
 => CACHED [tests_ubuntu_install_without_buildx 1/7] RUN apt-get update && 0.0s
 => CACHED [tests_ubuntu_install_without_buildx 2/7] RUN curl -fsSL https: 0.0s
 => CACHED [tests_ubuntu_install_without_buildx 3/7] RUN add-apt-repositor 0.0s
 => CACHED [tests_ubuntu_install_without_buildx 4/7] RUN  apt-get update & 0.0s
 => CACHED [tests_ubuntu_install_without_buildx 5/7] WORKDIR /python-on-wh 0.0s
 => CACHED [tests_ubuntu_install_without_buildx 6/7] COPY . .              0.0s
 => CACHED [tests_ubuntu_install_without_buildx 7/7] RUN pip install -e .  0.0s
 => exporting to image                                                     0.1s
 => => exporting layers                                                    0.0s
 => => writing image sha256:e1c2382d515b097ebdac4ed189012ca3b34ab6be65ba0c 0.0s
 => => naming to docker.io/library/some_image_name

ドッカースタック

ここでは、単純なスウォームピットスタックをローカル スウォーム にデプロイします。 いくつかのメソッドを持つ Stack オブジェクトを取得します。 remove(), services(), ps().

>>> from python_on_whales import docker
>>> docker.swarm.init()
>>> swarmpit_stack = docker.stack.deploy("swarmpit", compose_files=["./docker-compose.yml"])
Creating network swarmpit_net
Creating service swarmpit_influxdb
Creating service swarmpit_agent
Creating service swarmpit_app
Creating service swarmpit_db
>>> swarmpit_stack.services()
[<python_on_whales.components.service.Service object at 0x7f9be5058d60>,
<python_on_whales.components.service.Service object at 0x7f9be506d0d0>,
<python_on_whales.components.service.Service object at 0x7f9be506d400>,
<python_on_whales.components.service.Service object at 0x7f9be506d730>]
>>> swarmpit_stack.remove()

Docker Compose

ここでは、 Python-on-whalesでDocker Composeアプリケーションを実行する方法を示します。 舞台裏では、Golangで書かれた 新しいバージョンのCompose を使用していることに注意してください。 このバージョンの Compose はまだ実験段階です。 適切な予防策を講じてください。

$ git clone https://github.com/dockersamples/example-voting-app.git
$ cd example-voting-app
$ python
>>> from python_on_whales import docker
>>> docker.compose.up(detach=True)
Network "example-voting-app_back-tier"  Creating
Network "example-voting-app_back-tier"  Created
Network "example-voting-app_front-tier"  Creating
Network "example-voting-app_front-tier"  Created
example-voting-app_redis_1  Creating
example-voting-app_db_1  Creating
example-voting-app_db_1  Created
example-voting-app_result_1  Creating
example-voting-app_redis_1  Created
example-voting-app_worker_1  Creating
example-voting-app_vote_1  Creating
example-voting-app_worker_1  Created
example-voting-app_result_1  Created
example-voting-app_vote_1  Created
>>> for container in docker.compose.ps():
...     print(container.name, container.state.status)
example-voting-app_vote_1 running
example-voting-app_worker_1 running
example-voting-app_result_1 running
example-voting-app_redis_1 running
example-voting-app_db_1 running
>>> docker.compose.down()
>>> print(docker.compose.ps())
[]

ボーナスセクション:Python属性としてのDockerオブジェクト属性

アクセスできる docker inspect すべての情報は、Python 属性として使用できます。

>>> from python_on_whales import docker
>>> my_container = docker.run("ubuntu", ["sleep", "infinity"], detach=True)
>>> my_container.state.started_at
datetime.datetime(2021, 2, 18, 13, 55, 44, 358235, tzinfo=datetime.timezone.utc)
>>> my_container.state.running
True
>>> my_container.kill()
>>> my_container.remove()

>>> my_image = docker.image.inspect("ubuntu")
>>> print(my_image.config.cmd)
['/bin/bash']

パイソンオンクジラの次は何ですか?

現在、Python-on-whales と Docker CLI の新しい Compose との統合を改善しています (現在はベータ版)。

あなたはPython-on-whalesがベータ版であると考えることができます。 いくつかの小さな API の変更はまだ可能です。 

コミュニティが試してみて、 問題にフィードバックを提供することをお勧めします!

パイソンオンクジラの詳細については: