跳转到主要内容

一个不错的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

然后

你明白了 :) 它与我们所熟悉的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/buildkitdocker run --gpu=all ...
  • 支持Docker堆栈、服务和服务集群(与命令行相同的API)。
  • 在拉取、推送、加载、构建等操作时显示进度条和逐步输出。
  • 支持一些不在Docker-py中的一些CLI命令:docker cpdocker run --cpus ...等。
  • 对远程守护进程提供良好的SSH支持。
  • 将Docker对象作为Python对象:容器、镜像、卷、服务...以及它们的属性可以实时更新!
  • 每个Docker对象都可以用作上下文管理器。当退出上下文时,Docker对象将被自动删除,即使发生异常也是如此。
  • 一个完全类型化的API(与Mypy和IDE兼容)与pathlibos.path兼容。
  • 所有Docker对象和Docker客户端都可以在多线程和多进程中使用。
  • 通过设置环境变量DOCKERTOWN_DEBUG=1来显示调用命令和使用的环境变量。

为什么有另一个项目?为什么不基于Docker-py构建呢?

从某种意义上说,这个项目是基于Docker-py构建的,因为实现、组织和API受到了该项目的启发,但代码库不能相同。

两个主要差异不允许这样做

  1. API相当不同。Dockertown的目标是在Docker命令行和Python之间提供1到1的映射,这样用户甚至不需要打开文档就可以编写代码。

  2. 虽然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兼容的客户端(如PodmanNerdctl)的支持。

您可以通过使用dockertown.DockerCLientclient_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 (97.7 kB 查看哈希值)

上传时间

由以下机构支持

AWSAWS云计算和安全赞助商DatadogDatadog监控FastlyFastlyCDNGoogleGoogle下载分析MicrosoftMicrosoftPSF赞助商PingdomPingdom监控SentrySentry错误日志StatusPageStatusPage状态页