您好,我正在尝试从Docker文件构建Docker映像并出现以下错误:
java.lang.IllegalStateException:无法在构建后获取图像ID或摘要 在com.google.common.base.Preconditions.checkState(Preconditions.java:444)〜[guava-21.0.jar:na] 在com.spotify.docker.client.DefaultDockerClient $ BuildProgressHandler.getImageId(DefaultDockerClient.java:298)〜[docker-client-8.11.7.jar:8.11.7] 在com.spotify.docker.client.DefaultDockerClient $ BuildProgressHandler.access $ 1200(DefaultDockerClient.java:287)〜[docker-client-8.11.7.jar:8.11.7] 在com.spotify.docker.client.DefaultDockerClient.build(DefaultDockerClient.java:1481)〜[docker-client-8.11.7.jar:8.11.7]
我可以从命令行构建相同的Dockerfile,但由于堆栈跟踪信息不多,因此无法调试它。下面,我留下了一些可能相关的信息:
客户: 版本:17.03.2-ce API版本:1.27 服务器: 版本:17.03.2-ce API版本:1.27(最低版本1.12)
final AtomicReference<String> imageIdFromMessage = new AtomicReference<>();
final String returnedImageId = dockerClient.build(
Paths.get("/absolute/path/to/folder"), image.getImageName(), dockerfilefilename,new ProgressHandler() {
@Override
public void progress(ProgressMessage message) throws DockerException {
final String imageId = message.buildImageId();
if (imageId != null) {
imageIdFromMessage.set(imageId);
}
}
});
我可以提交任何其他相关信息,希望对您有任何帮助或想法。
编辑以添加所需的信息:
image
是docker映像的个人数据表示,唯一相关的是它具有我要标记docker的名称。
dockerfilefilename
只是一个包含dockerfile文件名的字符串。例如,字符串“ Dockerfile”。
dockerClient
是DockerClient的实例。它是这样创建的:
`
DockerClient dc = DefaultDockerClient.fromEnv().build();
final RegistryAuth registryAuth = RegistryAuth.builder() //TODO change to external config
.email("REDACTED")
.username("REDACTED")
.password("REDACTED")
.build();
final int statusCode = dc.auth(registryAuth);
return dc;
`
我已经检查过,并且状态码实际上是200。我已经使用驱动程序尝试了许多成功的Docker命令。
答案 0 :(得分:1)
我遇到了同样的问题(正如我在对该问题的评论中所述),并设法解决了该问题。您得到的错误是一个普遍的错误,是由于Docker客户端代码内部的健全性检查失败而导致的,这可能是由多种不同的事情引起的。
要获取导致健全性检查失败的具体原因,您可以查看进度处理程序中的message.error()
-在我的情况下,那里的错误消息非常清楚。
答案 1 :(得分:0)
我最后遇到了以下问题。在我的dockerfile中,维护者拼写错误。 请尝试通过使用docker build -t构建映像进行调试。