Создать докер из tar с Python Docker API - PullRequest
0 голосов
/ 12 декабря 2018

Я хочу использовать удаленный хост докера для создания образа из tar-памяти в памяти с помощью Python Docker API.

Я успешно создал образ докера при отправке только файла Docker следующим образом:

client.images.build(fileobj=BytesIO(dockerfile_str.encode("utf-8"))
                    tag="some_image_name",
                    encoding="utf-8")

Однако, когда я пытаюсь установить custom_context=True и передать tar archive в соответствии с документацией , происходит сбой с ошибкой:

docker.errors.APIError: 500 Server Error: Internal Server Error ("Cannot locate specified Dockerfile: Dockerfile")

Вот какЯ пытаюсь сделать это:

with tarfile.open(fileobj=BytesIO(), mode="w") as tar:
    dockerfile_str = """
        FROM ubuntu

        ENTRYPOINT ["printf", "Given command is %s"]

        CMD ["not given"]
    """.encode("utf-8")

    dockerfile_tar_info = tarfile.TarInfo("Dockerfile")
    dockerfile_tar_info.size = len(dockerfile_str)

    tar.addfile(dockerfile_tar_info, BytesIO(dockerfile_str))

    client = docker.DockerClient("some_url")
    client.images.build(fileobj=tar.fileobj,
                        custom_context=True,
                        dockerfile="Dockerfile",
                        tag="some_image_name",
                        encoding="utf-8")
    client.close()

РЕДАКТИРОВАТЬ:

Если я беру маршрут по диску с:

...
with tarfile.open("tmp_1.tar", mode="w") as tar:
...
client.images.build(fileobj=tarfile.open("tmp_1.tar", mode="r").fileobj,
...

Вместо этого я получаю следующее сообщение об ошибке:

docker.errors.APIError: 500 Server Error: Internal Server Error ("archive/tar: invalid tar header")  

1 Ответ

0 голосов
/ 12 декабря 2018

Хорошо.Я нашел решение.Мне пришлось позвонить .getvalue() на fileobj.

with tarfile.open(fileobj=BytesIO(), mode="w") as tar:
    dockerfile_str = """
        FROM ubuntu

        ENTRYPOINT ["printf", "Given command is %s"]

        CMD ["not given"]
    """.encode("utf-8")

    dockerfile_tar_info = tarfile.TarInfo("Dockerfile")
    dockerfile_tar_info.size = len(dockerfile_str)

    tar.addfile(dockerfile_tar_info, BytesIO(dockerfile_str))

    client = docker.DockerClient("some_url")
    client.images.build(fileobj=tar.fileobj.getvalue(),
                        custom_context=True,
                        dockerfile="Dockerfile",
                        tag="some_image_name",
                        encoding="utf-8")
    client.close()
...