docker : 在 python 脚本中使用 docker 客户端在不同的文件中捕获 STDOUT 和 STDERR

docker : Capture STDOUT and STDERR in different files using docker client in a python script

我有 python 脚本,负责 运行 docker 图像。对于 运行 我正在使用 docker 客户端的 docker 图像,运行 命令定义如下 -

def run_docker(self, cred, image, env, volumes, cmd):
    """
    Docker image needs to be executed after image is successfully pulled,
    and docker command is contructed based on the job parameters.
    """

    self.log.info('run_docker', state=self.state)
    self._docker_login(cred)
    self.docker_client = docker.from_env()
    self.container = self.docker_client.containers.run(
                                            image,
                                            environment=env,
                                            volumes=volumes,
                                            command=cmd,
                                            stderr=True,
                                            remove=True,
                                        )

有两个问题—— 1) 当您删除容器时,同时捕获 STDOUT 和 STDERR 的 docker 日志文件也会被删除。 由于这个问题,我决定将 STDOUT 和 STDERR 写入两个不同的文件,以便用户可以最大程度地灵活地分析 STDERR 和 STDOUT。

在使用此处提到的 docker 客户端时 - https://docker-py.readthedocs.io/en/stable/containers.html 运行 命令中的参数已相应修改。 但我不知道如何做到这一点。 另外 docker 客户端没有提到如何使用日志插件。

欢迎任何帮助或建议。

不要使用 remove=True。你可以稍后打电话给self.container.remove()

我会像这样用 detach=True 调用 run()

self.container = self.docker_client.containers.run(
                                        image,
                                        environment=env,
                                        volumes=volumes,
                                        command=cmd,
                                        stderr=True,
                                        detach=True,
                                    )

然后我会等待 self.container.wait() 并像这样分别检索 stdout 和 stderr 的日志:

out = self.container.logs(stdout=True, stderr=False)
err = self.container.logs(stdout=False, stderr=True)