找回密码
 立即注册
搜索
查看: 3642|回复: 19

Python api Container类的常用接口和使用方法

[复制链接]

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
发表于 2023-10-15 12:28:22 | 显示全部楼层 |阅读模式
本帖最后由 15000888164 于 2023-10-15 12:36 编辑
  1. 代码过长 按方法分类放在评论区
复制代码

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
 楼主| 发表于 2023-10-15 12:28:44 | 显示全部楼层
  1. def labels(self):
  2.         """
  3.         The labels of a container as dictionary.
  4.         用于获取 Docker 容器的标签信息
  5.         这个方法的主要目的是返回 Docker 容器的标签信息,这些标签通常是由用户定义的元数据,用于对容器进行注释或分类。标签以字典的形式返回,其中键值对表示标签名和相应的值。

  6.         方法的实现逻辑如下:

  7.         首先,它尝试从容器对象的属性中获取标签信息。具体来说,它访问容器的配置属性('Config')中的标签信息('Labels')。
  8.         如果标签信息存在,它将其返回为一个字典。如果标签信息不存在,它返回一个空字典({})。
  9.         如果在获取标签信息时出现 KeyError 异常,说明容器对象的属性中没有标签信息,它会引发一个自定义的 DockerException 异常,提示用户需要调用 reload() 方法来获取完整的容器信息
  10.         # 获取容器实例
  11.         container = client.containers.get('your_container_id')

  12.         # 获取容器的标签信息
  13.         container_labels = container.labels()
  14.         """
  15.         try:
  16.             result = self.attrs['Config'].get('Labels')
  17.             return result or {}
  18.         except KeyError:
  19.             raise DockerException(
  20.                 'Label data is not available for sparse objects. Call reload()'
  21.                 ' to retrieve all information'
  22.             )
复制代码

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
 楼主| 发表于 2023-10-15 12:29:01 | 显示全部楼层
  1. def status(self):
  2.         """
  3.         The status of the container. For example, ``running``, or ``exited``.
  4.         这个方法的主要目的是返回 Docker 容器的状态,通常是一个字符串,描述容器当前的状态,例如 "running" 表示容器正在运行,"exited" 表示容器已经退出。

  5.         方法的实现逻辑如下:

  6.         它首先检查容器对象的属性中的状态信息('State')是否是一个字典。如果是字典,它从字典中获取状态信息('Status' 键),并将状态字符串返回。
  7.         如果状态信息不是一个字典,它直接返回整个状态对象。
  8.         # 获取容器实例
  9.         container = client.containers.get('your_container_id')

  10.         # 获取容器的状态
  11.         container_status = container.status()

  12.         """
  13.         if isinstance(self.attrs['State'], dict):
  14.             return self.attrs['State']['Status']
  15.         return self.attrs['State']
复制代码

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
 楼主| 发表于 2023-10-15 12:29:25 | 显示全部楼层
  1. def ports(self):
  2.         """
  3.         The ports that the container exposes as a dictionary.
  4.         这个方法的主要目的是返回一个字典,其中包含容器所暴露的端口信息。这些端口信息通常用于网络连接,以确定容器内的应用程序可以通过哪些端口进行访问。
  5.         方法的实现逻辑如下:

  6.         首先,它尝试从容器对象的属性中获取网络设置信息('NetworkSettings')。
  7.         如果网络设置信息存在,它进一步尝试获取端口信息('Ports')。
  8.         如果端口信息存在,它将端口信息作为字典返回。如果网络设置或端口信息不存在,它返回一个空字典({})。
  9.         # 获取容器实例
  10.         container = client.containers.get('your_container_id')
  11.         # 获取容器暴露的端口信息
  12.         container_ports = container.ports()
  13.         """
  14.         return self.attrs.get('NetworkSettings', {}).get('Ports', {})
复制代码

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
 楼主| 发表于 2023-10-15 12:29:49 | 显示全部楼层
  1. def attach(self, **kwargs):
  2.         """
  3.         Attach to this container.

  4.         这个方法的主要目的是与容器建立连接,并获取容器的输出信息。它允许你选择是否要包括标准输出(stdout)、标准错误输出(stderr),以及是否要以流的形式逐步获取输出,或者一次性获取整个输出。
  5.         方法的参数和行为如下:
  6.         stdout(布尔值):指定是否要包括容器的标准输出。如果设置为 True,则会包括标准输出;如果设置为 False,则不包括标准输出。
  7.         stderr(布尔值):指定是否要包括容器的标准错误输出。如果设置为 True,则会包括标准错误输出;如果设置为 False,则不包括标准错误输出。
  8.         stream(布尔值):指定是否以流的形式逐步获取容器的输出。如果设置为 True,则会以迭代器的形式逐步获取输出;如果设置为 False,则会一次性获取整个输出。
  9.         logs(布尔值):指定是否要包括容器的以前的输出。如果设置为 True,则会包括以前的输出;如果设置为 False,则不包括以前的输出。
  10.         根据参数的不同组合,该方法可以用于获取容器的实时输出或以前的输出。
  11.         # 获取容器实例
  12.         container = client.containers.get('your_container_id')

  13.         # 以流的形式获取容器的输出
  14.         for line in container.attach(stdout=True, stderr=True, stream=True, logs=True):
  15.             print(line)
  16.         """
  17.         return self.client.api.attach(self.id, **kwargs)
复制代码

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
 楼主| 发表于 2023-10-15 12:30:20 | 显示全部楼层
  1. def attach_socket(self, **kwargs):
  2.         """

  3.         这个方法的主要目的是与容器建立连接,并获取容器的输出信息。不同之处在于,它返回一个类似套接字的对象,你可以直接处理这个对象以实时获取传入的数据流。

  4.         方法的参数和行为如下:

  5.         params(字典):请求参数的字典,可以包含 stdout、stderr、stream 等。
  6.         ws(布尔值):指定是否使用 WebSockets 而不是原始的 HTTP 连接。
  7.         通过使用 attach_socket 方法,你可以以更底层的方式处理容器的输出。例如,你可以使用它来建立一个实时的、双向的数据流,以便与容器中的应用程序进行交互。

  8.         示例使用方法如下(假设你使用了 websocket 库来处理 WebSockets 连接):
  9.         # 获取容器实例
  10.         container = client.containers.get('your_container_id')

  11.         # 通过 WebSocket 连接获取容器的输出
  12.         ws = websocket.create_connection(container.attach_socket(stream=True, ws=True))
  13.         while True:
  14.             data = ws.recv()
  15.             print(data)

  16.         """
  17.         return self.client.api.attach_socket(self.id, **kwargs)
复制代码

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
 楼主| 发表于 2023-10-15 12:30:36 | 显示全部楼层

这是将容器备份为新的镜像的接口

本帖最后由 15000888164 于 2023-10-15 12:36 编辑
  1. def commit(self, repository=None, tag=None, **kwargs):
  2.         """
  3.         这个方法的主要目的是将当前的 Docker 容器状态保存为一个新的 Docker 镜像,允许你创建自定义的镜像,以便将来可以基于该镜像运行容器。
  4.         方法的参数和行为如下:

  5.         repository(字符串):要将镜像推送到的存储库的名称。
  6.         tag(字符串):要推送的镜像的标签。
  7.         message(字符串):提交镜像时的提交消息。
  8.         author(字符串):提交镜像时的作者名称。
  9.         changes(字符串):在提交镜像时应用的 Dockerfile 指令。
  10.         conf(字典):用于指定容器配置的字典。你可以在 Engine API documentation 中找到有关容器配置的更多详细信息。
  11.         通过使用 commit 方法,你可以创建自定义的 Docker 镜像,该镜像基于当前容器的状态。这是一个有用的方法,特别是当你需要保存容器的状态以备将来使用时

  12.         # 获取容器实例
  13.         container = client.containers.get('your_container_id')

  14.         # 将容器提交为一个新镜像
  15.         new_image = container.commit(repository='my_repository', tag='my_tag')

  16.         """

  17.         resp = self.client.api.commit(self.id, repository=repository, tag=tag,
  18.                                       **kwargs)
  19.         return self.client.images.get(resp['Id'])
复制代码

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
 楼主| 发表于 2023-10-15 12:30:59 | 显示全部楼层
  1. def diff(self):
  2.         """
  3.         这个方法的主要目的是检查容器的文件系统上的更改,例如文件的创建、修改、删除等。它返回一个列表,其中每个元素都是一个字典,包含以下属性:

  4.         Path:更改的文件路径。
  5.         Kind:表示更改类型的字符串,通常可以是 "A"(表示新增文件)、"M"(表示修改文件)、"D"(表示删除文件)等。
  6.         通过使用 diff 方法,你可以了解容器的文件系统在容器运行期间发生的变化。这对于监视和调试容器内部的文件操作非常有用。

  7.         示例使用方法如下:
  8.         # 获取容器实例
  9.         container = client.containers.get('your_container_id')

  10.         # 检查容器文件系统的更改
  11.         changes = container.diff()

  12.         # 处理返回的更改信息
  13.         for change in changes:
  14.             print(f"Change Path: {change['Path']}, Kind: {change['Kind']}")
  15.         """
  16.         return self.client.api.diff(self.id)
复制代码

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
 楼主| 发表于 2023-10-15 12:31:23 | 显示全部楼层
  1. def exec_run(self, cmd, stdout=True, stderr=True, stdin=False, tty=False,
  2.                  privileged=False, user='', detach=False, stream=False,
  3.                  socket=False, environment=None, workdir=None, demux=False):
  4.         """
  5.         Run a command inside this container. Similar to
  6.         ``docker exec``.
  7.         这个方法的主要目的是在 Docker 容器内执行一个命令。它提供了多个参数以控制命令的执行方式,包括是否附加到容器的标准输入、标准输出和标准错误,是否分配伪终端(TTY)、是否以特权模式运行、以及更多选项。

  8.         方法的参数和行为如下:

  9.         cmd(字符串或列表):要在容器内执行的命令,可以是字符串或命令参数的列表。
  10.         stdout(布尔值):是否附加到标准输出。默认为 True。
  11.         stderr(布尔值):是否附加到标准错误。默认为 True。
  12.         stdin(布尔值):是否附加到标准输入。默认为 False。
  13.         tty(布尔值):是否分配伪终端(TTY)。默认为 False。
  14.         privileged(布尔值):是否以特权模式运行。默认为 False。
  15.         user(字符串):要作为哪个用户执行命令,默认为 "root"。
  16.         detach(布尔值):如果为 True,则从执行命令中分离。默认为 False。
  17.         stream(布尔值):是否流式返回数据。默认为 False。
  18.         socket(布尔值):是否返回连接套接字以允许自定义读写操作。默认为 False。
  19.         environment(字典或列表):执行命令时的环境变量设置。
  20.         workdir(字符串):执行命令时的工作目录路径。
  21.         demux(布尔值):是否将标准输出和标准错误分开。默认为 False。
  22.         根据方法的不同参数设置,exec_run 方法可以以不同方式执行命令,例如附加到容器的标准输入和输出,获取命令的输出结果等。最后,它返回一个包含执行结果的元组,其中包括命令的退出代码和输出数据。

  23.         示例使用方法如下:
  24.         # 获取容器实例
  25.         container = client.containers.get('your_container_id')

  26.         # 执行命令并获取结果
  27.         result = container.exec_run(cmd='ls -l', stdout=True, stderr=True, tty=False)

  28.         # 输出命令的执行结果
  29.         print(f"Exit Code: {result[0]}")
  30.         print(f"Output: {result[1].decode('utf-8')}")
  31.         """
  32.         resp = self.client.api.exec_create(
  33.             self.id, cmd, stdout=stdout, stderr=stderr, stdin=stdin, tty=tty,
  34.             privileged=privileged, user=user, environment=environment,
  35.             workdir=workdir,
  36.         )
  37.         exec_output = self.client.api.exec_start(
  38.             resp['Id'], detach=detach, tty=tty, stream=stream, socket=socket,
  39.             demux=demux
  40.         )
  41.         if socket or stream:
  42.             return ExecResult(None, exec_output)

  43.         return ExecResult(
  44.             self.client.api.exec_inspect(resp['Id'])['ExitCode'],
  45.             exec_output
  46.         )
复制代码

3

主题

18

回帖

2915

积分

魔云会员

积分
2915
 楼主| 发表于 2023-10-15 12:32:11 | 显示全部楼层
  1. def export(self, chunk_size=DEFAULT_DATA_CHUNK_SIZE):
  2.         """
  3.         Export the contents of the container's filesystem as a tar archive.
  4.         这个方法的主要目的是导出容器的文件系统内容并返回一个 tar 归档文件。方法接受一个参数 chunk_size,它决定了生成器每次迭代返回的字节数。如果设置为 None,数据将以接收到的方式进行流式传输。

  5.         使用这个方法,你可以将容器内部的文件系统内容导出为一个 tar 归档文件,这在备份、迁移、共享容器内文件等场景中非常有用。

  6.         示例使用方法如下:
  7.         # 获取容器实例
  8.         container = client.containers.get('your_container_id')

  9.         # 导出容器的文件系统内容为一个 tar 归档文件
  10.         exported_data = container.export(chunk_size= 1024*1024)

  11.         # 将导出的数据保存到文件
  12.         with open('container_export.tar', 'wb') as f:
  13.             for chunk in exported_data:
  14.                 f.write(chunk)
  15.         """
  16.         return self.client.api.export(self.id, chunk_size)
复制代码

手机版|魔云腾-论坛

GMT+8, 2024-11-28 11:56 , Processed in 0.040367 second(s), 20 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表