Essayez d'utiliser docker-py

!! Veuillez noter que le comportement est complètement différent selon la version!

Normalement, docker écoute en tant que démon, en écoutant le socket de domaine unix. En fait, le protocole qui circule dans cette socket est REST / HTTP, et vous pouvez le lier à tcp avec l'option -H, et il devient un serveur Web. Les spécifications sont décrites dans "Docker Remote API". Et il existe également divers clients de langue.

L'histoire d'un tel client python docker-py.

Tout d'abord, une utilisation normale.

import docker

dc = docker.Client()
# docker ps
dc.containers()
# docker images
dc.images()
# docker run -ti ubuntu bash
c = dc.create_container("ubuntu", stdin_open=True, tty=True)
dc.start(c["Id"])
print "docker attach %s" % c["Id"]

Pourtant.

Soyez prudent car il y a de sérieux pièges, comme "Oh ... je vais vous dire ce qui s'est passé maintenant."

La partie d'assemblage d'ExposedPorts dans / container / create. Est-ce une liste ou un tuple? Il y a des endroits où l'on peut vous demander un tuple, pensant que la liste est correcte. De plus, si ce n'est pas la bonne combinaison, la valeur correcte ne sera pas obtenue. En outre, le piège qu'aucune erreur ne se produit lors de son utilisation normale.

import traceback
import docker

dc = docker.Client()

tests = (
	[22,], # OK
	(22,), # NG
	["22/tcp",], # NG
	[(22, "tcp"),], # OK
	[[22, "tcp"],] # NG
	)

for ports in tests:
	c = dc.create_container("ubuntu", stdin_open=True, tty=True, command="bash", ports=ports)
	dc.start(c["Id"])
	info = dc.inspect_container(c["Id"])
	print ports, info["Config"]["ExposedPorts"]
	try:
		assert {'22/tcp': {}} == info["Config"]["ExposedPorts"]
	except:
		traceback.print_exc()
	finally:
		dc.stop(c["Id"])

Vient ensuite PortBindings dans / containers / (id) / start. Ouais ... je me demande. Quelle est cette incohérence?

import traceback
import docker

dc = docker.Client()

tests = (
	# automatic allocation
	{22:None}, # OK
	{"22/tcp": None}, # OK
	# manual allocation
	{22:10080}, # OK
	{"22/tcp": 10080}, # OK
	{22: ":10080"}, # NG
	{22: dict(HostPort=10080, HostIp="0.0.0.0")}, # NG
	{22: ["0.0.0.0", 10080]}, # NG
	{22: ("0.0.0.0", 10080)} # OK
	)

for port_bindings in tests:
	c = dc.create_container("ubuntu", stdin_open=True, tty=True, command="bash", ports=[22,])
	dc.start(c["Id"], port_bindings=port_bindings)
	info = dc.inspect_container(c["Id"])
	print port_bindings, info["HostConfig"]["PortBindings"]
	try:
		assert '22/tcp' in info["HostConfig"]["PortBindings"]
	except:
		traceback.print_exc()
	finally:
		dc.stop(c["Id"])

Recommended Posts

Essayez d'utiliser docker-py
Essayez d'utiliser Tkinter
Essayez d'utiliser Cookiecutter
Essayez d'utiliser PDFMiner
Essayez d'utiliser des géopandas
Essayez d'utiliser Selenium
Essayez d'utiliser scipy
Essayez d'utiliser pandas.DataFrame
Essayez d'utiliser django-swiftbrowser
Essayez d'utiliser matplotlib
Essayez d'utiliser tf.metrics
Essayez d'utiliser PyODE
Essayez d'utiliser virtualenv (virtualenvwrapper)
[Azure] Essayez d'utiliser Azure Functions
Essayez d'utiliser virtualenv maintenant
Essayez d'utiliser W & B
Essayez d'utiliser Django templates.html
[Kaggle] Essayez d'utiliser LGBM
Essayez d'utiliser l'analyseur de flux de Python.
Essayez d'utiliser Tkinter de Python
Essayez d'utiliser Tweepy [Python2.7]
Essayez d'utiliser collate_fn de Pytorch
Essayez d'utiliser PythonTex avec Texpad.
[Python] Essayez d'utiliser le canevas de Tkinter
Essayez d'utiliser l'image Docker de Jupyter
Essayez d'utiliser scikit-learn (1) - Clustering K par méthode moyenne
Essayez l'optimisation des fonctions à l'aide d'Hyperopt
Essayez d'utiliser matplotlib avec PyCharm
Essayez d'utiliser Azure Logic Apps
Essayez d'utiliser Kubernetes Client -Python-
[Kaggle] Essayez d'utiliser xg boost
Essayez d'utiliser l'API Twitter
Essayez d'utiliser OpenCV sur Windows
Essayez d'utiliser Jupyter Notebook de manière dynamique
Essayez d'utiliser AWS SageMaker Studio
Essayez de tweeter automatiquement en utilisant Selenium.
Essayez d'utiliser SQLAlchemy + MySQL (partie 1)
Essayez d'utiliser l'API Twitter
Essayez d'utiliser SQLAlchemy + MySQL (partie 2)
Essayez d'utiliser la fonction de modèle de Django
Essayez d'utiliser l'API PeeringDB 2.0
Essayez d'utiliser la fonction de brouillon de Pelican
Essayez d'utiliser pytest-Overview and Samples-
Essayez d'utiliser le folium avec anaconda
Essayez d'utiliser l'API Admin de la passerelle Janus
[Statistiques] [R] Essayez d'utiliser la régression par points de division.
Essayez d'utiliser Spyder inclus dans Anaconda
Essayez d'utiliser des modèles de conception (édition exportateur)
Essayez d'utiliser Pillow sur iPython (partie 1)
Essayez d'utiliser Pillow sur iPython (partie 2)
Essayez d'utiliser l'API de Pleasant (python / FastAPI)
Essayez d'utiliser LevelDB avec Python (plyvel)
Essayez d'utiliser pynag pour configurer Nagios
Essayez d'utiliser la fonction de débogage à distance de PyCharm
Essayez d'utiliser ArUco avec Raspberry Pi
Essayez d'utiliser LiDAR bon marché (Camsense X1)
[Serveur de location Sakura] Essayez d'utiliser flask.
Essayez d'utiliser Pillow sur iPython (partie 3)
Renforcer l'apprentissage 8 Essayez d'utiliser l'interface utilisateur de Chainer
Essayez d'obtenir des statistiques en utilisant e-Stat
Essayez d'utiliser l'API d'action de Python argparse