使用 Python Docker API 从 tar 创建 docker
Create docker from tar with Python Docker API
我想使用远程 docker 主机从内存中的 tar 和 Python Docker API 构建图像。
我在发送 Docker 文件时成功创建了一个 docker 图像,如下所示:
client.images.build(fileobj=BytesIO(dockerfile_str.encode("utf-8"))
tag="some_image_name",
encoding="utf-8")
但是,当我尝试设置 custom_context=True
并根据 documentation 传递 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")
嗯。我找到了解决方案。我不得不在 fileobj
上给 .getvalue()
打电话。
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()
我想使用远程 docker 主机从内存中的 tar 和 Python Docker API 构建图像。
我在发送 Docker 文件时成功创建了一个 docker 图像,如下所示:
client.images.build(fileobj=BytesIO(dockerfile_str.encode("utf-8"))
tag="some_image_name",
encoding="utf-8")
但是,当我尝试设置 custom_context=True
并根据 documentation 传递 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")
嗯。我找到了解决方案。我不得不在 fileobj
上给 .getvalue()
打电话。
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()