一个不错的Docker CLI的Python包装器
项目描述
Dockertown
NOTE: this project is based on the python-on-whales project, you can find it at https://github.com/gabrieldemarmiesse/python-on-whales.
Dockertown是一个不错的Docker CLI的Python包装器。
在Linux、macOS和Windows上工作,支持Python 3.7及以上版本。
文档可以在以下地址找到: https://duckietown.github.io/dockertown/
GitHub仓库可以在以下地址找到: https://github.com/duckietown/dockertown
如何安装?
pip install dockertown
一些酷的例子
开始操作
from dockertown import docker
然后
docker run hello-world
->docker.run("hello-world")
docker pull ubuntu
->docker.pull("ubuntu")
docker build ./
->docker.build("./")
docker compose up my_service
->docker.compose.up(["my_service"])
docker image ls
->docker.image.list()
docker ps
->docker.ps()
docker cp
->docker.copy()
你明白了 :) 它与我们所熟悉的CLI相同。
>>> from dockertown import docker
>>> output = docker.run("hello-world")
>>> print(output)
Hello from Docker!
This message shows that your installation appears to be working correctly.
...
>>> from dockertown import docker
>>> print(docker.run("nvidia/cuda:11.0-base", ["nvidia-smi"], gpus="all"))
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 450.51.06 Driver Version: 450.51.06 CUDA Version: 11.0 |
|-------------------------------+----------------------+----------------------+
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. |
| | | MIG M. |
|===============================+======================+======================|
| 0 Tesla T4 On | 00000000:00:1E.0 Off | 0 |
| N/A 34C P8 9W / 70W | 0MiB / 15109MiB | 0% Default |
| | | N/A |
+-------------------------------+----------------------+----------------------+
+-----------------------------------------------------------------------------+
| Processes: |
| GPU GI CI PID Type Process name GPU Memory |
| ID ID Usage |
|=============================================================================|
| No running processes found |
+-----------------------------------------------------------------------------+
>>> from dockertown import docker
>>> my_docker_image = docker.pull("ubuntu:20.04")
20.04: Pulling from library/ubuntu
e6ca3592b144: Downloading [=============> ] 7.965MB/28.56MB
534a5505201d: Download complete
990916bd23bb: Download complete
>>> print(my_docker_image.repo_tags)
['ubuntu:20.04']
>>> docker.image.list()
[dockertown.Image(id='sha256:1a437e363abfa', tags=['ubuntu:20.04'])]
>>> my_docker_image.remove()
>>> from dockertown import docker
>>> my_image = docker.build(".", tags="some_name") # uses Buildx/buildkit by default
[+] Building 1.6s (17/17) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 32B 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/python:3.6 1.4s
=> [python_dependencies 1/5] FROM docker.io/library/python:3.6@sha256:29328c59adb9ee6acc7bea8eb86d0cb14033c85 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 72.86kB 0.0s
=> CACHED [python_dependencies 2/5] RUN pip install typeguard pydantic requests tqdm 0.0s
=> CACHED [python_dependencies 3/5] COPY tests/test-requirements.txt /tmp/ 0.0s
=> CACHED [python_dependencies 4/5] COPY requirements.txt /tmp/ 0.0s
=> CACHED [python_dependencies 5/5] RUN pip install -r /tmp/test-requirements.txt -r /tmp/requirements.txt 0.0s
=> CACHED [tests_ubuntu_install_without_buildx 1/7] RUN apt-get update && apt-get install -y apt-tr 0.0s
=> CACHED [tests_ubuntu_install_without_buildx 2/7] RUN curl -fsSL https://download.docker.com/linux/ubuntu/g 0.0s
=> CACHED [tests_ubuntu_install_without_buildx 3/7] RUN add-apt-repository "deb [arch=amd64] https://downl 0.0s
=> CACHED [tests_ubuntu_install_without_buildx 4/7] RUN apt-get update && apt-get install -y docker-ce- 0.0s
=> CACHED [tests_ubuntu_install_without_buildx 5/7] WORKDIR /dockertown 0.0s
=> CACHED [tests_ubuntu_install_without_buildx 6/7] COPY . . 0.0s
=> CACHED [tests_ubuntu_install_without_buildx 7/7] RUN pip install -e . 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.0s
=> => writing image sha256:e1c2382d515b097ebdac4ed189012ca3b34ab6be65ba0c650421ebcac8b70a4d 0.0s
=> => naming to docker.io/library/some_image_name
一些带有postgres的更高级的docker.run()
示例
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
变为
from dockertown import docker
docker.run(
"postgres:9.6",
name="some-postgres",
envs={"POSTGRES_PASSWORD": "mysecretpassword"},
detach=True,
)
print(docker.ps())
# [dockertown.Container(id='f5fb939c409d', name='some-postgres')]
docker run -it --rm --network some-network postgres psql -h some-postgres -U postgres
变为
from dockertown import docker
# since it's interactive, you'll be dropped into the psql shell. The python code
# will continue only after you exit the shell.
docker.run(
"postgres:9.6",
["psql", "-h", "some-postgres", "-U", "postgres"],
networks=["some-network"],
interactive=True,
tty=True,
remove=True,
)
docker run -d --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -e PGDATA=/var/lib/postgresql/data/pgdata -v /custom/mount:/var/lib/postgresql/data -v myvolume:/tmp/myvolume postgres -c shared_buffers=256MB -c max_connections=200
变为
from dockertown import docker
docker.run(
"postgres:9.6",
["-c", "shared_buffers=256MB", "-c", "max_connections=200"],
name="some-postgres",
envs={"POSTGRES_PASSWORD": "mysecretpassword", "PGDATA": "/var/lib/postgresql/data/pgdata"},
volumes=[("/custom/mount", "/var/lib/postgresql/data"), ("myvolume", "/tmp/myvolume")],
detach=True,
)
主要功能
- CLI接口和Python API之间实现1到1的映射。不需要在文档中查找所需函数/参数的名称。
- 支持最新的Docker功能: Docker buildx/buildkit,
docker run --gpu=all ...
- 支持Docker堆栈、服务和服务集群(与命令行相同的API)。
- 在拉取、推送、加载、构建等操作时显示进度条和逐步输出。
- 支持一些不在Docker-py中的一些CLI命令:
docker cp
,docker run --cpus ...
等。 - 对远程守护进程提供良好的SSH支持。
- 将Docker对象作为Python对象:容器、镜像、卷、服务...以及它们的属性可以实时更新!
- 每个Docker对象都可以用作上下文管理器。当退出上下文时,Docker对象将被自动删除,即使发生异常也是如此。
- 一个完全类型化的API(与Mypy和IDE兼容)与
pathlib
和os.path
兼容。 - 所有Docker对象和Docker客户端都可以在多线程和多进程中使用。
- 通过设置环境变量
DOCKERTOWN_DEBUG=1
来显示调用命令和使用的环境变量。
为什么有另一个项目?为什么不基于Docker-py构建呢?
从某种意义上说,这个项目是基于Docker-py构建的,因为实现、组织和API受到了该项目的启发,但代码库不能相同。
两个主要差异不允许这样做
-
API相当不同。Dockertown的目标是在Docker命令行和Python之间提供1到1的映射,这样用户甚至不需要打开文档就可以编写代码。
-
虽然Docker-py是对Docker客户端二进制文件的完整重新实现(用Go编写),但Dockertown位于Docker客户端二进制文件之上,这使得实现新功能变得更加容易和安全。例如,docker-py不太可能很快支持Buildx/buildkit,因为将大型Go代码库重写为Python是项艰巨的工作。
我应该使用Docker-py还是Dockertown?
嗯,每个项目的描述中都写得很清楚!
- Docker-py:Docker Engine API的Python库
- Dockertown:一个优秀的Docker CLI的Python包装器
如果您需要直接与Docker引擎通信,需要进行底层操作,请使用docker-py。一些好的例子包括从IDE中控制Docker的代码,或者如果Docker调用的速度非常重要。如果您不想依赖Docker CLI二进制文件(约50MB),请使用docker-py。
如果您想从Python中调用docker命令行,执行高级操作,请使用Dockertown。例如,如果您想用Python而不是bash(一个非常不错的选择)编写您的CI逻辑。Dockertown中也有一些命令只在其中可用:docker.buildx.build(...)
,docker.stack.deploy(...)
...
使用正确的工具做正确的工作 :)
Docker的替代方案:Podman,nerdctl...
Dockertown版本0.44.0引入了对与Docker兼容的客户端(如Podman和Nerdctl)的支持。
您可以通过使用dockertown.DockerCLient
的client_call
参数来使用任意二进制文件执行Docker命令。以下是一个示例
>>> from dockertown import DockerClient
>>> nerdctl = DockerClient(client_call=["nerdctl"])
>>> nerdctl.pull("python:3.9")
docker.io/library/python:3.9: resolved |++++++++++++++++++++++++++++++++++++++|
index-sha256:a83c0aa6471527636d7331c30704d0f88e0ab3331bbc460d4ae2e53bbae64dca: done |++++++++++++++++++++++++++++++++++++++|
manifest-sha256:8ccef93ff3c9e1bb9562d394526cdc6834033a0498073d41baa8b309f4fac20e: done |++++++++++++++++++++++++++++++++++++++|
config-sha256:f033692e2c5abe1e0ee34bcca759a3e4432b10b0031174b08d48bcc90d14d68b: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:9952b1051adaff513c99f86765361450af108b12b0073d0ba40255c4e419b481: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:c766e27afb21eddf9ab3e4349700ebe697c32a4c6ada6af4f08282277a291a28: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:1535e3c1181a81ea66d5bacb16564e4da2ba96304506598be39afe9c82b21c5c: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:6de7cb7bdc8f9b4c4d6539233fe87304aa1a6427c3238183265c9f02d831eddb: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:967757d5652770cfa81b6cc7577d65e06d336173da116d1fb5b2d349d5d44127: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:c357e2c68cb3bf1e98dcb3eb6ceb16837253db71535921d6993c594588bffe04: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:26787c68cf0c92a778db814d327e283fe1da4434a7fea1f0232dae8002e38f33: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:6aefca2dc61dcbcd268b8a9861e552f9cdb69e57242faec64ac120d2355a9c1a: done |++++++++++++++++++++++++++++++++++++++|
layer-sha256:32a180f5cf85702e7680719c40c39c07972b1176355df5a621de9eb87ad07ce2: done |++++++++++++++++++++++++++++++++++++++|
elapsed: 35.9s total: 333.5 (9.3 MiB/s)
dockertown.Image(id='sha256:f033692e2c5ab', tags=['python:3.9'])
您可以使用podman做类似的事情
from dockertown import DockerClient
podman = DockerClient(client_call=["podman"])
podman.pull("hello-world")
podman.run("hello-world")
print(podman.ps())
...
贡献
欢迎所有PR。请参阅此文档。
关于许可证呢?
这是一个MIT许可证,相当宽松。
许可证可以在git仓库中找到。
项目详情
dockertown-0.2.6.tar.gz 的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 1cee9c7c9b5c682aa528360684f4f503ae7ebdc0a842ae6a32a1cedf055acd16 |
|
MD5 | 40e9869df4f863ebeaf5129f3ddc491b |
|
BLAKE2b-256 | f0786d394fa6ad70ef174d1649e57ebf756c1801f8dfdfae6dc3774a414bcf4f |