[PYTHON] Greifen Sie mit Requests auf die Docker Remote API zu

Überblick

Ich möchte Docker Remote API von Python Requests verwenden. Es kann von TCP aus verwendet werden, wenn es verschlüsselt ist. Da wir jedoch daran denken, die API vom selben Host aus zu verwenden, verwenden wir den Unix-Socket.

Lesen und Schreiben von Unix-Sockets

Die Docker-Socket-Datei befindet sich in / var / run / docker.sock. Das Lesen und Schreiben von Socket-Dateien ist wie folgt.

import socket
s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
s.connect("/var/run/docker.sock")
# s.recv, s.send, etc.

Verwenden Sie Ihren eigenen Socket mit Anfragen

Dies ist ziemlich ärgerlich und erfordert die Implementierung von Transport Adapter. Zu diesem Zweck müssen PoolManager, HTTPConnectionPool und HTTPConnection zusammen implementiert werden.

import socket
import requests
from requests.adapters import HTTPAdapter
from requests.packages.urllib3 import PoolManager, HTTPConnectionPool
from httplib import HTTPConnection

class MyAdapter(HTTPAdapter):

    def __init__(self, sockfile, **kwargs):
        self._sockfile = sockfile
        super(MyAdapter, self).__init__(**kwargs)

    def init_poolmanager(self, connections, maxsize, **kwargs):
        self.poolmanager = MyPoolManager(self._sockfile,
                                         num_pools=connections, maxsize=maxsize)


class MyPoolManager(PoolManager):

    def __init__(self, sockfile, **kwargs):
        self._sockfile = sockfile
        super(MyPoolManager, self).__init__(**kwargs)

    def _new_pool(self, scheme, host, port):
        return MyConnectionPool(self._sockfile, host, port, **self.connection_pool_kw)


class MyConnectionPool(HTTPConnectionPool):

    def __init__(self, sockfile, host, port, **kwargs):
        self._sockfile = sockfile
        super(MyConnectionPool, self).__init__(host, port, **kwargs)

    def _new_conn(self):
        self.num_connections += 1
        return MyConnection(self._sockfile,
                            host=self.host, port=self.port, strict=self.strict)
   
   
class MyConnection(HTTPConnection):

    def __init__(self, sockfile, **kwargs):
        self._sockfile = sockfile
        HTTPConnection.__init__(self, **kwargs)

    def connect(self):
        self.sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
        self.sock.connect(self._sockfile)

        if self._tunnel_host:
            self._tunnel()

Beachten Sie, dass HTTPConnection eine alte Klasse ist. Seien Sie also vorsichtig mit der Initialisierungsmethode.

Verwendung der API

Das Verwendungsbeispiel lautet wie folgt.

req = requests.Session()
req.mount("http://", MyAdapter("/var/run/docker.sock"))
print req.get("http://127.0.0.1/images/json?all=0").json()

Der Ort, an dem es als http://127.0.0.1 geschrieben ist, ist nicht gut ...

Referenz

Recommended Posts

Greifen Sie mit Requests auf die Docker Remote API zu
Rufen Sie die API mit python3 auf.
Holen Sie sich das Wetter mit Python-Anfragen
Holen Sie sich das Wetter mit Python-Anfragen 2
Klicken Sie mit Python auf die Etherpad-Lite-API
Greifen Sie mit Python auf die Twitter-API zu
Gewähren Sie mit dem Befehl curl ein Zugriffstoken und POSTEN Sie die API
Führen Sie IDCF Cloud CLI auf Docker aus
Hinter dem Flyer: Docker mit Python verwenden
Holen Sie sich Urlaub mit der Google Kalender-API
Spielen Sie mit Dajare mithilfe der COTOHA-API
Melden Sie sich mit SSH bei einem Remote-Server an
Twittern Sie regelmäßig mit der Twitter-API in Go-Sprache
Hinweis: Bereiten Sie die Umgebung von CmdStanPy mit Docker vor
Bereiten Sie die Ausführungsumgebung von Python3 mit Docker vor
Rufen Sie die Web-API mit Anfragen auf. Beispiel: Flickr
Bis Sie die Kaggle-API mit Colab verwenden
Verwenden Sie die Kaggle-API in einem Docker-Container
Holen Sie sich ein Zugriffstoken für die Pocket-API
Greifen Sie mit Requests auf eine Site mit Clientzertifikatauthentifizierung zu
Es ist zu einfach, mit rauth auf die Twitter-API zuzugreifen, und ich habe sie ...
Spielen Sie mit der von Yahoo bereitgestellten Stromverbrauchs-API
Ändern Sie die Zeitzone in Oracle Database Docker
Klicken Sie nach der Oauth-Authentifizierung mit Django auf die Twitter-API
[Boto3] Suchen Sie mit der List Users API nach Cognito-Benutzern
Registrieren Sie Tickets mit der Redmine-API mithilfe von Python-Anforderungen
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
Aufbau einer Pepper-Kun-Fernbedienungsumgebung mit Docker + IPython Notebook
Erhalten Sie Kommentare und Abonnenten mit der YouTube-Daten-API
Vorbereiten der Ausführungsumgebung von PyTorch mit Docker November 2019
Ich habe versucht, die API mit dem Python-Client von echonest zu erreichen
TFTP-Server mit Docker
[Venv nicht erforderlich] Die stärkste Python-Entwicklungsumgebung, die mit Remote Containern erstellt wurde [VS Code / Docker]
Guru Navi API-Zugriffsmethode
Ich habe mit Docker eine API erstellt, die den vorhergesagten Wert des maschinellen Lernmodells zurückgibt
Verwenden Sie Python mit Docker
Extrudieren Sie mit der Fusion360-API
Proxyserver mit Docker
Hallo, Welt mit Docker
Wiederholen Sie den Vorgang mit Python-Anforderungen
Versuchen Sie, mit Python schnell und einfach auf die Twitter-API zuzugreifen
Geben Sie den Projektnamen von Docker-Compose mit Docker-Integration von Pycharm an
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Greifen Sie auf das Feld C-Struktur mit dem in Go reservierten Namen zu.
Die erste API, die mit dem Python Djnago REST-Framework erstellt wurde
Greifen Sie über das Ausführungsskript mit einem relativen Pfad auf die Datei zu.
Greifen Sie mit python27 / pyodbc auf dem Container auf den SQL Server des Hosts zu
Berühren wir die API der Netatmo Weather Station mit Python. #Python #Netatmo
Mit der LINE WORKS-Kalender-API können Sie Termine an andere Personen weitergeben
Optimieren Sie das Sammeln von Informationen mit Twitter API und Slack Bots
Ich habe versucht, den DRF-API-Anforderungsverlauf mit django-request zu speichern
Wenn Sie auf den Webserver zugreifen, L Chika mit Arduino
Rufen Sie den Hostnamen des Host-PCs mit Docker unter Linux ab
Bis die von Flask + MySQL erstellte API in Docker konvertiert wird