Docker SDK for Python:如何使用自定义Dockerfile和自定义上下文构建映像

Docker SDK for Python:如何使用自定义Dockerfile和自定义上下文构建映像,python,docker,dockerfile,Python,Docker,Dockerfile,我正在尝试使用Docker SDK for Python复制此命令: docker build -f path/to/dockerfile/Dockerfile.name -t image:version path/to/context/. path/to/dockerfile和path/to/context是不同的路径,即: /opt/project/dockerfile和/opt/project/src/app/ 目录结构如下所示: opt ├── project │ ├── dock

我正在尝试使用Docker SDK for Python复制此命令:

docker build -f path/to/dockerfile/Dockerfile.name -t image:version path/to/context/.
path/to/dockerfilepath/to/context是不同的路径,即: /opt/project/dockerfile/opt/project/src/app/

目录结构如下所示:

opt
├── project
│   ├── dockerfile
│   │   └── Dockerfile.name
│   └── src
│       └── app
│           └── target
│               └── app-0.0.1-SNAPSHOT.jar
└── script.py
FROM openjdk:16-alpine
COPY target/app-0.0.1-SNAPSHOT.jar app.jar
CMD ["java", "-jar", "-Dspring.profiles.active=docker", "/app.jar"]
该命令在CLI中正常工作,但我无法使其与SDK一起工作

从中,图像生成方法具有以下参数:

  • path(str)–包含Dockerfile的目录的路径(我猜这就是上下文)
  • 自定义上下文(bool)–如果使用fileobj,则为可选
  • fileobj–用作Dockerfile的文件对象。(或类似文件的对象)
当我使用这样的方法时:

client.images.build(
    path = path_to_context,
    fileobj=open(path_to_file, 'rb'),
    custom_context=True,
    tag='image:version'
)
我得到这个错误:

Traceback (most recent call last):
  File "script.py", line 33, in <module>
    client.images.build(
  File "/Library/Python/3.8/site-packages/docker/models/images.py", line 298, in build
    raise BuildError(last_event or 'Unknown', result_stream)
docker.errors.BuildError: {'message': 'unexpected EOF'}
但是我猜这个错误并不是因为命令正确地与CLI一起工作,它只是与SDK一起中断

我做错什么了吗

谢谢

编辑:

简单地删除custom_context=True并不能解决问题,因为上下文和构建路径是不同的。事实上,它会导致另一个错误,这与文件在当前路径中不存在有关:

Traceback (most recent call last):
  File "script.py", line 33, in <module>
    client.images.build(
  File "/Library/Python/3.8/site-packages/docker/models/images.py", line 287, in build
    raise BuildError(chunk['error'], result_stream)
docker.errors.BuildError: COPY failed: file not found in build context or excluded by .dockerignore: stat target/app-0.0.1-SNAPSHOT.jar: file does not exist
回溯(最近一次呼叫最后一次):
文件“script.py”,第33行,在
client.images.build(
文件“/Library/Python/3.8/site packages/docker/models/images.py”,第287行,内部版本
引发BuildError(区块['error'],结果流)
docker.errors.BuildError:复制失败:在生成上下文中找不到文件或被排除。DockerRigNore:stat target/app-0.0.1-SNAPSHOT.jar:文件不存在

我删除了
custom\u context=True,
问题就消失了

编辑:

使用项目树:

import docker
client = docker.from_env()

client.images.build(
    path = './project/src/app/target/',
    dockerfile = '../../../Dockerfile/Dockerfile.name',
    tag='image:version',
)
client.images.build(
    path = '/opt/project/src/',
    dockerfile = '/opt/project/dockerfile/Dockerfile.name',
    tag = 'image:version'
)

即使文档引用了构建上下文到Dockerfile的“路径”,如果指定了绝对路径,它也适用于构建上下文外部的Dockerfile

使用我的项目树:

import docker
client = docker.from_env()

client.images.build(
    path = './project/src/app/target/',
    dockerfile = '../../../Dockerfile/Dockerfile.name',
    tag='image:version',
)
client.images.build(
    path = '/opt/project/src/',
    dockerfile = '/opt/project/dockerfile/Dockerfile.name',
    tag = 'image:version'
)

这并不能解决问题,我编辑了这个问题以包含这一点。好吧,我的错。我在Dockerfile中用COPY命令做了一个新的测试,它可以使用
Dockerfile
()和
path
,我删除了
fileobj
。让我知道它是否适合你。很高兴知道,做得好:)它可以工作!此外,即使文档引用了“构建上下文中到Dockerfile的路径”,如果指定了绝对路径,它也适用于构建上下文之外的Dockerfile。