当前位置: 首页 > 工具软件 > Docker-py > 使用案例 >

docker-py使用笔记

汪安宁
2023-12-01

记录一下使用接口的参数以及遇到的问题,详细文档还需阅读代码中的注释。

官方文档:GitHub - docker/docker-py: A Python library for the Docker Engine API

import docker
client = docker.from_env()
container = client.containers.run(image_name,
                        detach=True,
                        #remove=True,  ##如果该参数为True,docker stop该容器时会直接删除容器,谨慎使用。
                        tty=True,
                        volumes=['/:/app'],  ##路径映射--宿主机路径:容器内路径
                        command="python3 test.py",  ##容器内运行命令
                        working_dir="/app/mnt",  ##容器内工作路径
                        device_requests=[docker.types.DeviceRequest(device_ids=['5,6'],capabilities=[['gpu']])],  ##为容器指定配置gpu,相当于docker --gpus '"device=5,6"'
                        )
container.start()
container_id = container.id   ##获取容器ID
command = "ls"
#code,stream = container.exec_run(command,stream=True)
container = client.containers.get(container_id)  ##可以通过容器ID获取容器对象
status = container.status ##获取容器状态,running/exit
container.remove(force=True)  ##docker rm -f container_id
client.containers.list()  ##获取所有容器

常见API参数说明: 

1.client.containers.run()调用的是ContainerCollection类中的方法run(),container.exec_run()调用的Container类中的方法exec_run(),这两个方法参数较多且在一个模块中,其他参数参考代码注释:docker-py/containers.py at main · docker/docker-py · GitHub

2.在创建容器时可以直接通过 client.containers.run()指定容器运行后内部启动的服务。其中参数remove=True会在容器停止时直接删除容器。

3.配置gpus参数:

device_requests=[docker.types.DeviceRequest(device_ids=['4'],capabilities=[['gpu']])] 或device_requests=[docker.types.DeviceRequest(count=3,capabilities=[['gpu']])],这里可以使用device_ids或者count,当使用count时表明使用多少个gpu,如果指定gpu需要使用参数device_ids=['2,3'],数列中的数字需为str类型。使用规则可参考源码:Add device requests by Lucidiot · Pull Request #2471 · docker/docker-py (github.com)

4.获取指定容器:

client.containers.list()  获取对应容器,相当于docker ps,可设置参数:docker-py/containers.py at bc0a5fbacd7617fd338d121adca61600fc70d221 · docker/docker-py (github.com)

all=True  -----------------获取所有容器,默认状态为running的容器,默认all=False。

limit=2  ----------------获取最近创建的2个容器

filters={"ancestor":image_name}  ----------------获取image_name镜像对应的所有容器

filters={"status":"running"}  ----------------获取状态为running的所有容器

filters={"name":container_name}  ----------------获取命名为container_name的容器

问题一:

container.stop()以后查看容器状态直接使用container.status发现容器状态还是running,需要重新获取容器对象该属性才会更新。

原因:源码中的container.status为container属性,container.stop()方法不会去更新该属性。

持续更新中... ... 

 类似资料: