Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何解决;无法从docker中检索.Id“;使用Jenkins管道构建Docker映像时_Docker_Jenkins_Dockerfile_Jenkins Pipeline - Fatal编程技术网

如何解决;无法从docker中检索.Id“;使用Jenkins管道构建Docker映像时

如何解决;无法从docker中检索.Id“;使用Jenkins管道构建Docker映像时,docker,jenkins,dockerfile,jenkins-pipeline,Docker,Jenkins,Dockerfile,Jenkins Pipeline,我正在使用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 ---&g

我正在使用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
为什么尽管docker镜像成功构建,它仍抛出此错误? 当我在本地机器上执行此操作时,命令在“成功标记myapp:latest”上退出

我的docker版本是18.03.1-ce


在此问题上的任何帮助都将不胜感激

Jenkins插件中似乎有一个bug

您可以尝试删除多阶段生成名称(“
作为最终版本”
”,因为您不需要它):

但是,如果确实需要引用以前构建的映像(多阶段),解决方法可以是使用
--copy from 0
(对应的0,1,2,而不是别名)

詹金斯的相关问题


编辑

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


我没有使用Jenkinsfile管道文件,而是在Jenkins作业中执行一个Shell来执行Docker build命令。(docker版本-t最新版本。)


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

java.io.IOException: Cannot retrieve .Id from 'docker inspect centos:7'
我的Dockerfile中的第一步是:

FROM centos:7

我能够解决docker pull centos:7的问题;在那之后,Jenkins构建能够成功完成。

我遇到了这个问题,因为我使用
--target=
只在某一点上构建我的映像

所以我的Dockerfile看起来像这样

FROM maven:3.6-jdk-8 AS BUILD

.. do build ..

FROM openjdk:8

COPY --from=BUILD /myapp/bin my_jar_file
而我使用docker.build(,“--target=build.”)的生成将失败,原因是:

java.io.IOException: Cannot retrieve .Id from 'docker inspect openjdk:8'
这是因为Jenkins正试图检查Docker文件中openjdk:8中的第二个
,并且因为该目标没有运行Docker没有拉下该图像,Docker inspect无法使用该图像

我有很多解决办法:

  • 在构建之前,通过运行
    docker pull openjdk:8
    确保映像仍然可用
  • 从我的
    docker.BUILD
    命令中删除
    --target=BUILD
    ,让它构建整个过程(对我来说没什么大不了的,因为构建是最昂贵的部分)
  • 避免使用
    docker.build
    而只使用
    sh“docker build--target=build.

  • 目前我还不确定我会选择哪一个

    以上想法都不适用于我的案例,我最终在Dockerfile上没有做任何更改的情况下,让它按照以下管道工作:

  • 硬编码build标签,如“latest”
  • 通过sh获取您自己的标签
  • 首先推送带有硬编码标签的图像
  • 使用自定义标记再次推送图像

  • 我猜Jenkins Docker插件没有正确地支持多阶段Docker构建。这里有一个PR解决了这个问题:您可以构建插件并手动加载它,直到维护人员checksHanks@Robert I将
    作为最终
    删除,以便只从base
    中获取
    ,但是现在错误已更改为
    无法从'Docker inspect base'中检索.Id
    I我的Dockerfile中没有inspect,但怀疑从基运行
    仍然存在问题
    ?我将查看相关问题。其中一个问题提到了一个非常奇怪的解决方法,即在Dockerfile的最顶部添加此“从头开始”,然后在每个“从开始”之前预留一个空格“。你能试试吗?谢谢,我试过了,但是我仍然收到了“docker inspect base AS final”(docker inspect base AS final)中的错误
    无法检索到.Id,有两种可能的解决方案(从头开始、从缩进和删除AS final),我从“docker inspect base”中得到错误
    无法检索.Id
    我通过不使用Jenkins文件管道文件,而是在Jenkins作业中执行一个Shell来执行docker build命令来实现这一点。使用索引
    COPY--from=0
    对我来说效果很好。谢谢这起作用了。澄清一下,因为这个答案并不完整:您需要在不同的阶段运行“docker pull…”,以便在不同的阶段使用不同的代理时,它在代理指令之前运行。如果您只使用一个代理,那么我建议您考虑使用多个代理来解决这个问题,并将其与这里的答案结合起来。
    FROM maven:3.6-jdk-8 AS BUILD
    
    .. do build ..
    
    FROM openjdk:8
    
    COPY --from=BUILD /myapp/bin my_jar_file
    
    java.io.IOException: Cannot retrieve .Id from 'docker inspect openjdk:8'
    
    def my_own_tag = "unknown"
    my_own_tag = sh ( script: 'git tag | tail -n1', returnStdout: true ).trim()
    docker_img = docker.build("latest")
    docker_img.push("latest")
    docker_img.push("${my_own_tag}")