在使用Jenkins管道构建Docker镜像时,如何解决“无法从docker检索.Id”

问题描述 投票:17回答:4

我正在使用Jenkins管道来构建Dockerfile。

dockerfile成功完成所有步骤,并创建docker镜像。

如图所示:

Step 16/19 : FROM base AS final
 ---> <id>
Step 17/19 : WORKDIR /app
 ---> Using cache
 ---> <id>
Step 18/19 : COPY --from=publish /app .
 ---> Using cache
 ---> <id>
Step 19/19 : ENTRYPOINT ["", "myapp.dll"]
 ---> Using cache
 ---> <id>
Successfully built cb3y81938e88
Successfully tagged myapp:latest

但是,在此之后,shell失败并出现以下错误:

java.io.IOException: Cannot retrieve .Id from 'docker inspect base AS final'

尽管成功构建了docker镜像,为什么会抛出此错误?当我在本地计算机上执行此命令时,命令退出“成功标记myapp:latest”

我的码头版本是18.03.1-ce。

任何有关这个问题的帮助将不胜感激!

docker jenkins dockerfile jenkins-pipeline
4个回答
19
投票

似乎Jenkins插件中存在一个错误。

您可以尝试删除多阶段构建名称(“AS final”,因为您不需要它):

FROM base
(....)

但是如果你真的需要引用以前构建的图像(多阶段),可以使用--copy-from 0(0,1,2,因为它对应,而不是别名)

詹金斯的相关问题


编辑

在此记录OP发现的解决方案:

我没有使用Jenkinsfile管道文件,而是在Jenkins作业中执行Shell来执行Docker构建命令。 (docker build -t latest-build。)


2
投票

我遇到了这个问题,因为我正在使用--target=<foo>来构建我的图像,直到某一点。

所以我的Dockerfile看起来像这样

FROM maven:3.6-jdk-8 AS BUILD

.. do build ..

FROM openjdk:8

COPY --from=BUILD /myapp/bin my_jar_file

我与docker.build(<tag>, "--target=BUILD .")的构建失败了:

java.io.IOException: Cannot retrieve .Id from 'docker inspect openjdk:8'

这是因为Jenkins试图检查Dockerfile中的第二个FROM openjdk:8,并且因为该目标没有运行Docker没有拉下该图像而且它不能用于docker inspect

我有一堆可用的解决方法:

  1. 在构建之前运行docker pull openjdk:8,确保图像可用
  2. 从我的--target=BUILD命令中删除docker.build并让它构建整个东西(对我来说不是太大的交易,因为构建是最昂贵的部分)
  3. 避免使用docker.buildsh "docker build --target=BUILD .

目前我不确定我会选哪一个


1
投票

我遇到了Docker 18.09的同样问题,但我没有使用多阶段构建。就我而言,我得到了:

java.io.IOException: Cannot retrieve .Id from 'docker inspect centos:7'

我的Dockerfile的第一步是:

FROM centos:7

我能用docker pull centos:7修复问题;之后,Jenkins构建成功完成。

© www.soinside.com 2019 - 2024. All rights reserved.