动态构建时如何将文件复制到 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/
我想使用 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/