GNU/Linux >> Linux の 問題 >  >> Linux

PythonとBashを使用したPodmanRESTfulAPIの調査

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")

詳細
  • 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ページで問題やプルリクエストに関するご意見をお待ちしております。


Linux
  1. Podmanルートレスコンテナでのファイルとデバイスの使用

  2. 外部変数と埋め込みスクリプトを使用してBashスクリプトを作成する方法

  3. Bashでのケースステートメントの使用

  1. Bash を使用してファイルを検索してコピーする

  2. OpenCV と python/virtualenv?

  3. bash スクリプトで curl を使用して curl を取得する:(3) URL に不正な文字が見つかりました

  1. 自動化のためのBashの使用

  2. trace.py を使用して Python スクリプトをトレースする方法

  3. bash から変数をエクスポートして Python で使用する