Vorab, mit Docker kenne ich mich nicht aus.
cli = Client(base_url='unix://var/run/docker.sock')
Irgendne Docker-Client-API...
containers = {}
Ein Dictionary bzw. key-value Store
for container in cli.containers(all=True, filters={'status': 'exited'}):
Das scheint bei der Client API alle Container abzufragen, die sich im "exited" Status befinden
containers[container['Names'][0]] = container['Id']
Container haben Namen (womöglich mehrere, [0] nimmt den ersten aus der Liste von Namen) und Ids. Da wird im dictionary die Zuordnung name → id gespeichert. So daß man mit containers[name] die id bekommt.
Anders ausgedrückt wird da eine komplizierte Datenstruktur auf eine einfache runtergedampft.
if 'mysql56' in containers:
log.info("Starting MySQL")
cli.start(container=containers.pop("/mysql56"))
Einmal eine Extrawurst für den Container mit dem Namen 'mysql56'. Vermutlich muss der zuerst laufen damit andere Container gestartet werden können. Allerdings ist mir da der containers.pop Aufruf schleierhaft.
$ python
Python 3.7.3 (default, Mar 26 2019, 21:43:19)
[GCC 8.2.1 20181127] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> containers = {}
>>> containers['mysql56'] = 'extrawurst'
>>> if 'mysql56' in containers:
... print(containers.pop("/mysql56"))
...
Traceback (most recent call last):
File "<stdin>", line 2, in <module>
KeyError: '/mysql56'
>>> containers
{'mysql56': 'extrawurst'}
>>> containers.pop('mysql56')
'extrawurst'
>>> containers
{}
Also eigentlich müsste das containers.pop('mysql56') sein oder aber die Docker API hat eben AUCH noch einen Container namens "/mysql56" ausgespuckt, aber irgendwie ist das schräg.
Kann auch sein daß ich völlig auf dem Brett stehe, mein Python ist schon eine ganze Weile her.
for container in containers.values():
log.info("Starting {}".format(container))
cli.start(container=container)
Da werden die ganzen anderen Container gestartet und dabei nicht mal die so aufwendig eingesammelten Namen ausgegeben ...