- 确保要在其上运行 Python SDK 的进程可以访问
/var/run/docker.sock。在示例中,我将其作为卷安装到容器中
- python 代码无论如何都在使用套接字,因此无需生成额外的子进程来执行 curl。您可以完全访问所有状态信息。在需要更详细的地方使用
htpc:
container_name: htpc
build:
context: .
dockerfile: flask-Dockerfile
ports:
- "5000:5000"
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock # map through socket
def docker_api():
client = docker.from_env()
if request.args["action"] == "list":
l = []
for c in client.containers.list(all=True):
# string conversion only works for 6 digit ms, strip back to 26 chars
if c.status == "running":
utc_time = datetime.strptime(client.api.inspect_container(c.short_id)["State"]["StartedAt"][:26]+"Z", "%Y-%m-%dT%H:%M:%S.%fZ")
else:
utc_time = datetime.utcnow()
l.append({"id":c.short_id, "name":c.name, "image":c.image.tags[0] if len(c.image.tags)>0 else "unknown",
"status":c.status, "logs":True, "inspect":True,
"stats":c.status=="running", "restart":c.status=="running", "stop":c.status=="running", "start":c.status!="running", "delete":True,
"uptime":(utc_time - datetime(1970, 1, 1)).total_seconds(),
})
return Response(json.dumps(l), mimetype="text/json")
elif request.args["action"] == "logs":
return Response(client.containers.get(request.args["id"]).logs().decode(), mimetype="text/plain")
elif request.args["action"] == "stats":
return Response(json.dumps(client.containers.get(request.args["id"]).stats(stream=False)), mimetype="text/json")
elif request.args["action"] == "inspect":
js = client.api.inspect_container(request.args["id"])
m = {"StartedAt":js["State"]["StartedAt"], "Mounts":js["Mounts"]}
for i, mp in enumerate(m["Mounts"]):
m["Mounts"][i] = {k: mp[k] for k in ('Source', 'Destination')}
e = {"Env":js["Config"]["Env"], 'RestartPolicy':js['HostConfig']['RestartPolicy']}
p = {"Ports":js["NetworkSettings"]["Ports"]}
js = {**m, **e, **p} #, **js}
return Response(json.dumps(js), mimetype="text/json")