Docker: захват STDOUT и STDERR в разных файлах с помощью клиента Docker в скрипте Python - PullRequest
0 голосов
/ 25 сентября 2018

У меня есть скрипт на python, который отвечает за запуск образа докера.Для запуска образа 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) При удалении контейнера файл журнала Docker, который захватывает STDOUT и STDERRвместе тоже удаляется.Из-за этой проблемы я решил записать STDOUT и STDERR в два разных файла, чтобы пользователь мог анализировать STDERR и STDOUT с максимальной гибкостью.

При использовании док-клиента, как упомянуто здесь - https://docker -py.readthedocs.io / en / stable / Containers.html Параметры были изменены соответствующим образом в команде запуска.Но я не могу понять, как этого добиться.Также Docker клиент не упоминает, как использовать подключаемые модули регистрации.

Любая помощь или предложения приветствуются.

1 Ответ

0 голосов
/ 25 сентября 2018

Не используйте remove=True.Вы можете позвонить self.container.remove() позже.

Я бы позвонил run() с detach=True следующим образом:

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)
...