[PYTHON] Accéder à l'API Docker Remote avec des requêtes

Aperçu

Je souhaite utiliser Docker Remote API depuis Python Requests. Il peut être utilisé à partir de TCP s'il est chiffré, mais comme nous envisageons d'utiliser l'API du même hôte, nous utilisons le socket unix.

Lecture et écriture de sockets Unix

Le fichier de socket Docker se trouve dans / var / run / docker.sock. La lecture et l'écriture des fichiers de socket sont les suivantes.

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

Utilisez votre propre socket avec les requêtes

C'est assez ennuyeux et nécessite l'implémentation de Transport Adapter. Et pour cela, il est nécessaire d'implémenter ensemble PoolManager, HTTPConnectionPool et HTTPConnection.

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

Notez que HTTPConnection est une classe à l'ancienne, soyez donc prudent avec la méthode d'initialisation.

Utilisation de l'API

L'exemple d'utilisation est le suivant.

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

L'endroit où il est écrit comme http://127.0.0.1 n'est pas bon ...

référence

Recommended Posts

Accéder à l'API Docker Remote avec des requêtes
Appelez l'API avec python3.
Obtenez la météo avec les requêtes Python
Obtenez la météo avec les requêtes Python 2
Accédez à l'API Etherpad-lite avec Python
Accéder à l'API Twitter avec Python
Accordez un jeton d'accès avec la commande curl et POST l'API
Exécutez IDCF Cloud CLI sur Docker
Derrière le flyer: utiliser Docker avec Python
Obtenez des vacances avec l'API Google Agenda
Jouez avec Dajare en utilisant l'API COTOHA
Connectez-vous à un serveur distant avec SSH
Tweetez régulièrement avec l'API Twitter Go language
Remarque: préparez l'environnement de CmdStanPy avec docker
Préparer l'environnement d'exécution de Python3 avec Docker
Accédez à l'API Web à l'aide de requêtes Exemple: Flickr
Jusqu'à ce que vous utilisiez l'API Kaggle avec Colab
Utilisez l'API Kaggle dans un conteneur Docker
Obtenez un jeton d'accès pour l'API Pocket
Accéder à un site avec l'authentification par certificat client avec les demandes
C'est trop facile d'accéder à l'API Twitter avec rauth et je l'ai ...
Jouez avec l'API de consommation d'énergie fournie par Yahoo
Modifier le fuseau horaire dans Oracle Database Docker
Accédez à l'API Twitter après l'authentification Oauth avec Django
[Boto3] Rechercher des utilisateurs Cognito avec l'API List Users
Enregistrez des tickets avec l'API de Redmine en utilisant des requêtes Python
Créez une carte thermique de tweet avec l'API Google Maps
Construction de l'environnement de contrôle à distance Pepper-kun avec Docker + IPython Notebook
Obtenez des commentaires et des abonnés avec l'API de données YouTube
Préparation de l'environnement d'exécution de PyTorch avec Docker Novembre 2019
J'ai essayé de frapper l'API avec le client python d'echonest
Serveur TFTP avec Docker
[Venv non requis] L'environnement de développement Python le plus puissant créé avec des conteneurs distants [VS Code / Docker]
Méthode d'accès à l'API Guru Navi
J'ai créé une API avec Docker qui renvoie la valeur prédite du modèle d'apprentissage automatique
Utiliser python avec docker
Extruder avec l'API Fusion360
Serveur proxy avec Docker
Bonjour le monde avec Docker
Réessayer avec des requêtes python
Essayez d'utiliser l'API Twitter rapidement et facilement avec Python
Spécifiez le nom du projet de docker-compose avec l'intégration Docker de Pycharm
Une note sur l'utilisation de l'API Facebook avec le SDK Python
Accédez au champ de structure C avec le nom réservé dans Go.
La première API à créer avec le framework Python Djnago REST
Accédez au fichier avec un chemin relatif à partir du script d'exécution.
Accédez au serveur SQL de l'hôte avec python27 / pyodbc sur le conteneur
Touchons l'API de Netatmo Weather Station avec Python. #Python #Netatmo
Donnez des rendez-vous à d'autres avec l'API de calendrier LINE WORKS
Rationalisez la collecte d'informations avec l'API Twitter et les robots Slack
J'ai essayé de sauvegarder l'historique des demandes d'API DRF avec django-request
Lorsque vous accédez au serveur Web, L Chika avec Arduino
Obtenez le nom d'hôte du PC hôte avec Docker sous Linux
Jusqu'à ce que l'API créée par Flask + MySQL soit convertie en Docker