记录一下使用接口的参数以及遇到的问题,详细文档还需阅读代码中的注释。
官方文档: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() ##获取所有容器
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()方法不会去更新该属性。
持续更新中... ...