动态构建时如何将文件复制到 docker 图像

How do I copy a file to docker image when building dynamically

我想使用 Python/docker-py 动态构建 docker 图像。我的示例代码如下所示。问题是我在 COPY 命令中 运行 进入构建上下文之外的 禁止路径 错误。我不知道将我的 build.sql (sql_build_path} 文件放在哪里以避免在动态情况下出现这种情况。

docker_file = f"""
    FROM postgres
    ENV POSTGRES_USER myuser
    ENV POSTGRES_PASSWORD mypassword
    ENV POSTGRES_DB mydb
    ENV ON_ERROR_STOP 1
    COPY {sql_build_path} /docker-entrypoint-initdb.d/
"""
f = io.BytesIO(docker_file.encode('utf-8'))
client = docker.from_env()
client.images.build(fileobj=f, tag="test", rm=True)

[编辑]
谢谢,Jeevan——我发现这是一个已知的(并且有些争议)issue,受限于安全隐患。动态构建 docker 文件并将资源复制到目录似乎是最好的回应。对于我的解决方案,我选择 python 的临时目录 API。

with tempfile.TemporaryDirectory() as temp_dir:
    # save docker file to this directory
    # copy other files to this directory
    name, updates = client.images.build(path=temp_dir, dockerfile='Dockerfile', tag="test")
    for u in updates:
        print(u)

默认情况下,fileobj 发送 Dockerfile 没有任何构建上下文,这就是为什么你不能复制任何东西。

这是我的方法:

创建 Dockerfile 并复制 build.sql 到 Dockerfile 的目录

build-img.py

import docker
path = '/root/Test/'  # Where Dockerfile and build.sql resides
client = docker.from_env()
print("Building image")
client.images.build(path=path, dockerfile='Dockerfile',tag="test-image")

Dockerfile

FROM postgres
ENV POSTGRES_USER myuser
ENV POSTGRES_PASSWORD mypassword
ENV POSTGRES_DB mydb
ENV ON_ERROR_STOP 1
COPY build.sql /docker-entrypoint-initdb.d/