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.
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.
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.
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 ...
Recommended Posts