Docker
Docker はエンジニアにとって非常に便利なツールとして知られています。多くのエンジニアは Docker Desktop でイメージやコンテナの確認を行っていると思います。今回、ローカルで利用する Docker イメージの自動更新が必要になり、日次バッチで対応できないか検討していたところ、 Python から Docker を操作することができるパッケージがあったので、備忘録としてその利用方法を書き留めておきたいと思います。
PyPI – docker
Docker パッケージのインストール
Docker パッケージは pip でインストールすることができます。pip install docker
操作方法
Dockerクライアント取得
Docker を操作するには、クライアントの取得が必要になります。処理の最初に必ず入れるようにしましょう。しかし Docker が起動していない状態の場合エラーになりますので、事前に Docker Desktop を起動するなどしておきましょう。
client = docker.from_env()
イメージの操作
Docker にはイメージがないと何もできないので、イメージ周りの操作から説明します。まずはローカルにあるイメージを取得には、次のようにします。
# ローカルにあるイメージを取得 images = client.images.list() print(images)
client.images.list() はイメージを配列で返してくれます。詳しく見たい場合は、 images をループで回せばいいでしょう。できれば「IN USE」のイメージを取得したかったですが、そのようなプロパティがなかったので私はコンテナのステータスと組み合わせて「IN USE」のイメージを判定したりしています。
ときにはイメージを取得したいときもあるでしょう。 docker コマンドでいうと、 docker pull ですね。それもこのパッケージでは可能です。
# イメージを取得する client.images.pull('{image_name}')
{image_name} にイメージ名を入力するとイメージをダウンロードしてくれます。具体的に記述すると次のようになります。
client.images.pull('python')
この場合、 python の latest タグがついているイメージを取得できます。もちろんダウンロードには時間がかかるので、 pull が完了したら次の処理に移るようになっています。
タグを指定する必要がある場合は、次のように指定します。
# 特定のタグのイメージを取得する client.images.pull('{image_name}', tag='{image_tag}')
具体的に記述すると次のようになります。
client.images.pull('python', tag='3.9.13')
これで 3.9.13 タグの python イメージを取得できます。
コンテナの操作
起動中のコンテナを取得するには、次のようにします。# 起動中のコンテナ launching_containers = client.containers.list() print(launching_containers)
また停止しているコンテナも含めて全コンテナを取得するには、引数を追加します。
# 全てのコンテナ all_containers = client.containers.list(all=True) print(all_containers)
イメージを元にコンテナを立ち上げるには、 run メソッドを実行します。
# イメージを元にコンテナを立ち上げる client.containers.run('{image_name}')
実際には名前を付けて立ち上げることが多いと思いますので、次のようにして名前を付けてあげればいいでしょう。
# イメージを元に名前をつけてコンテナを立ち上げる client.containers.run('{image_name}', name='{container_name}')
停止している特定の名前のコンテナを起動する場合は、次のようにします。
# 停止している特定の名前のコンテナを起動する client.containers.get('{container_name}').start()containers の get メソッドを見ると引数は container_id となっていますが、 id もしくは name を渡すことができるようになっています。
ローカルにおいて、name は一意ですので指定できて当然と言えば当然ですね。
停止している全コンテナを起動したい場合は、全コンテナを取得しステータスを確認して起動すればいいでしょう。
# 停止しているコンテナを全て起動する all_containers = client.containers.list(all=True) for container in all_containers: if container.status == 'exited': container.start()
まとめ
今回は、Python から Docker を操作することができるパッケージを紹介しました。普段叩いている docker コマンドは一通り処理できるので、自動化させることも容易です。私にとって、ここ最近で最も素晴らしいと感じたパッケージでした。ぜひ活用してみてください。