PodmanV2に新しいRESTfulAPIがあると聞いたことがあるかもしれません。このドキュメントでは、Pythonのコード例とシェルコマンドを使用してAPIを示します。追加の注記はコードコメントに含まれています。提供されたコードは、本番品質に対して明確になるように作成されています。
要件
- Python>3.4がインストールされています。
- Pythonリクエストライブラリをインストールしました。
- インストールに関する注意事項
- Pythonを編集するためのIDEをお勧めします。
- 2つのターミナルウィンドウ:1つはPodmanサービスの実行とデバッグ情報の確認用、2つ目はスクリプトの実行用です。
- curlおよびjqコマンドの使用法が示されています。
- ここで接続URLを確認できます。
はじめに
サービス
これらの例では、Podmanサービスを通常のユーザーとして、セキュリティで保護されていないTCP/IPポート番号で実行しています。
本番環境では、Podmanサービスはsystemdのソケットアクティベーションプロトコルを使用する必要があります。これにより、Podmanは追加のデーモンなしでクライアントをサポートし、アクセスエンドポイントを保護できます。
次のコマンドは、タイムアウトせずにポート8080でPodmanサービスを実行します。 ^ Cと入力する必要があります チュートリアルが終了したら、このターミナルウィンドウに移動します。
# podman system service tcp:localhost:8080 --log-level=debug --time=0
上で示したTCPソケットに加えて、PodmanサービスはsystemdのソケットアクティベーションプロトコルとUnixドメインソケット(UDS)での実行をサポートしています。
[次のこともお勧めします:スニークピーク:Podmanの新しいREST API]
Pythonコード
情報リソース
以下に、Podmanサービスとホストに関する情報を示します。
import json
import requests
response = requests.get("http://localhost:8080/v1.40.0/libpod/info")
詳細h4> -
requests.get()
リクエストを呼び出します GETHTTPメソッドを使用してURLをPodmanサービスに渡すためのライブラリ。 - リクエスト ライブラリは、一般的なすべてのHTTPメソッドのヘルパーメソッドを提供します。
-
http://localhost:8080
上記のPodmanサービスの呼び出しと一致します。
-
/v1.40.0
使用しているAPIバージョンを示します。
-
/libpod
サービスがlibpod
を提供することを期待していることを示します -特定のリターンペイロード。 - この要素を使用しないと、サーバーは互換性のあるペイロードを返します。
-
/info
クエリするリソースを指定します。
requests.get()
リクエストを呼び出します GETHTTPメソッドを使用してURLをPodmanサービスに渡すためのライブラリ。 - リクエスト ライブラリは、一般的なすべてのHTTPメソッドのヘルパーメソッドを提供します。
http://localhost:8080
上記のPodmanサービスの呼び出しと一致します。/v1.40.0
使用しているAPIバージョンを示します。/libpod
サービスがlibpod
を提供することを期待していることを示します -特定のリターンペイロード。 - この要素を使用しないと、サーバーは互換性のあるペイロードを返します。
/info
クエリするリソースを指定します。読むのは興味深いですが、出力がない場合、それが機能したことをどのようにして知ることができますか?
出力の取得
以下の行を追加すると、ホストで実行されているPodmanのバージョンを確認できます。
response.raise_for_status()
info = json.loads(response.text)
print(info.version.Version)
-
raise_for_status()
ステータスコードが200〜399でない場合、例外が発生します。 -
json.loads()
HTTP応答の本文をオブジェクト/辞書にデコードします。
実行すると、出力は次のようになります。
2.1.0-dev
シェルから次のように動作します:
$ curl -s 'http://localhost:8080/v1.40.0/libpod/info' | jq .version.Version
"2.1.0-dev"
コンテナの一覧表示
import json
import requests
response = requests.get("http://localhost:8080/v1.40.0/libpod/containers/json?all=true")
response.raise_for_status()
ctnrs = json.loads(response.text)
for c in ctnrs:
print(c.Id)
json.loads()
HTTPボディをオブジェクト/辞書の配列にデコードし、プログラムは各コンテナIDを出力します。例:
$ curl -s 'http://localhost:8080/v1.40.0/libpod/containers/json?all=true' | jq .[].Id
"81af11ef7188a826cb5883330525e44afea3ae82634980d68e4e9eefc98d6f61"
クエリパラメータがall=trueの場合 提供されていなかった場合は、実行中のコンテナーのみがリストされます。 APIのリソースクエリとパラメータはここに記載されています。
何か便利なもの
いくつかの例を見てきましたが、もう少し便利なものはどうでしょうか。次の優れたコンテナの開発が完了しました。以下のスクリプトにより、ローカルストレージからすべてが削除されます。 (clean_storage.pyの入力を節約したい場合)
#!/usr/bin/env python
import json
import requests
# Clean up local storage by removing all containers, pods, and images. Any error will
# abort the process
confirm = input("Really delete all items from storage? [y/N] ")
if str(confirm).lower().strip() != 'y':
exit(0)
# Query for all pods in storage
response = requests.get("http://localhost:8080/v1.40.0/libpod/pods/json")
response.raise_for_status()
pods = json.loads(response.text)
# Workaround for https://github.com/containers/podman/issues/7392
if pods is not None:
for p in pods:
# For each container: delete container and associated volumes
response = requests.delete(f"http://localhost:8080/v1.40.0/libpod/pods/{p['Id']}?force=true")
response.raise_for_status()
print(f"Removed {len(pods)} pods and associated objects")
else:
print(f"Removed 0 pods and associated objects")
# Query for all containers in storage
response = requests.get("http://localhost:8080/v1.40.0/libpod/containers/json?all=true")
response.raise_for_status()
ctnrs = json.loads(response.text)
for c in ctnrs:
# For each container: delete container and associated volumes
print(c.keys())
response = requests.delete(f"http://localhost:8080/v1.40.0/libpod/containers/{c['Id']}?force=true&v=true")
response.raise_for_status()
print(f"Removed {len(ctnrs)} containers and associated objects")
# Query for all images in storage
response = requests.get("http://localhost:8080/v1.40.0/libpod/images/json")
response.raise_for_status()
imgs = json.loads(response.text)
for i in imgs:
# For each image: delete image and any associated containers
response = requests.delete(f"http://localhost:8080/v1.40.0/libpod/images/{i['Id']}?force=true")
response.raise_for_status()
print(f"Removed {len(imgs)} images and associated objects")
[コンテナを使い始めますか?この無料コースをチェックしてください。コンテナ化されたアプリケーションのデプロイ:技術的な概要。 ]
概要
これがお役に立てば幸いです。 APIドキュメントには、すべてのリソースと必要なメソッドが記載されています。入力本体と出力本体、およびステータスコードが含まれています。
Podmanコードは開発が進んでおり、プロジェクトのGitHubページで問題やプルリクエストに関するご意見をお待ちしております。