GNU/Linux >> Belajar Linux >  >> Linux

Menjelajahi Podman RESTful API menggunakan Python dan Bash

Anda mungkin pernah mendengar bahwa Podman V2 memiliki RESTful API baru. Dokumen ini mendemonstrasikan API menggunakan contoh kode dalam Python dan perintah shell. Catatan tambahan disertakan dalam komentar kode. Kode yang diberikan ditulis agar jelas vs. kualitas produksi.

Persyaratan

  • Anda telah menginstal Python>3.4.
  • Anda telah menginstal pustaka permintaan Python.
    • catatan pemasangan
  • Disarankan IDE untuk mengedit Python.
  • Dua jendela terminal:satu untuk menjalankan layanan Podman dan meninjau informasi debug, jendela kedua untuk menjalankan skrip.
  • Penggunaan perintah curl dan jq didemonstrasikan.
  • Anda dapat meninjau URL koneksi di sini.

Memulai

Layanan

Untuk contoh ini, kami menjalankan layanan Podman sebagai pengguna biasa dan pada nomor port TCP/IP yang tidak aman.

Untuk produksi, layanan Podman harus menggunakan protokol aktivasi soket systemd. Hal ini memungkinkan Podman untuk mendukung klien tanpa daemon tambahan dan mengamankan titik akhir akses.

Perintah berikut menjalankan layanan Podman pada port 8080 tanpa waktu habis. Anda harus mengetikkan ^C ke jendela terminal ini setelah Anda selesai dengan tutorial.

# podman system service tcp:localhost:8080 --log-level=debug --time=0

Selain soket TCP yang ditunjukkan di atas, layanan Podman mendukung berjalan di bawah protokol aktivasi soket systemd dan soket domain Unix (UDS).

[ Anda mungkin juga menyukai: Sneak peek:REST API baru Podman ]

Kode python

Sumber informasi

Berikut ini adalah informasi tentang layanan dan host Podman:

import json
import requests


response = requests.get("http://localhost:8080/v1.40.0/libpod/info")

Menyelam dalam

  • requests.get() memanggil permintaan library untuk meneruskan URL ke layanan Podman menggunakan metode GET HTTP.
    • Permintaan library menyediakan metode pembantu untuk semua metode HTTP populer.
  • http://localhost:8080 cocok dengan permintaan layanan Podman di atas.
  • /v1.40.0 menunjukkan versi API yang kami gunakan.
  • /libpod menunjukkan bahwa kami mengharapkan layanan untuk menyediakan libpod - payload pengembalian spesifik.
    • Tidak menggunakan elemen ini menyebabkan server mengembalikan muatan yang kompatibel.
  • /info menentukan sumber daya yang kita kueri.

Menarik untuk dibaca, tapi tanpa output, bagaimana kita tahu itu berhasil?

Mendapatkan keluaran

Tambahkan baris di bawah ini, dan sekarang Anda dapat melihat versi Podman yang berjalan di host:

response.raise_for_status()


info = json.loads(response.text)
print(info.version.Version)
  • raise_for_status() memunculkan pengecualian jika kode status tidak antara 200 dan 399.
  • json.loads() menerjemahkan isi respons HTTP ke dalam objek/kamus.

Saat dieksekusi, outputnya adalah:

2.1.0-dev

Berikut ini berfungsi dari shell:

$ curl -s 'http://localhost:8080/v1.40.0/libpod/info' | jq .version.Version


"2.1.0-dev"

Mendaftarkan container

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() menerjemahkan badan HTTP ke dalam larik objek/kamus, program kemudian mencetak setiap ID wadah. Misalnya:

$ curl -s 'http://localhost:8080/v1.40.0/libpod/containers/json?all=true' | jq .[].Id


"81af11ef7188a826cb5883330525e44afea3ae82634980d68e4e9eefc98d6f61"

Jika parameter kueri all=true belum disediakan, maka hanya wadah yang sedang berjalan yang akan terdaftar. Kueri dan parameter sumber daya untuk API didokumentasikan di sini.

Sesuatu yang berguna

Kami telah melihat beberapa contoh, tetapi bagaimana dengan sesuatu yang sedikit lebih berguna? Anda telah selesai mengembangkan wadah hebat berikutnya, dan skrip di bawah ini akan menghapus semuanya dari penyimpanan lokal Anda. (Jika Anda ingin menghemat dengan mengetik 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")

[ Memulai container? Lihat kursus gratis ini. Menyebarkan aplikasi kemas:Tinjauan teknis. ]

Ringkasan

Saya harap kamu terbantu dengan hal ini. Dokumentasi API memberi Anda semua sumber daya dan metode yang diperlukan. Badan masukan dan keluaran disertakan serta kode status.

Kode Podman sedang dalam pengembangan yang berat dan kami menyambut masukan Anda terkait masalah dan permintaan penarikan di halaman GitHub proyek.


Linux
  1. Menggunakan file dan perangkat dalam wadah tanpa akar Podman

  2. Cara membuat skrip Bash menggunakan variabel eksternal dan skrip yang disematkan

  3. Cara Melacak Skrip Python menggunakan trace.py

  1. Menggunakan Bash untuk otomatisasi

  2. Menggunakan Pernyataan Kasus di Bash

  3. OpenCV dan python/virtualenv?

  1. temukan dan salin file menggunakan Bash

  2. Array di Bash Tidak Ditemukan

  3. Menggunakan dan di Bash while loop