我正在使用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。
任何有关这个问题的帮助将不胜感激!
似乎Jenkins插件中存在一个错误。
您可以尝试删除多阶段构建名称(“AS final
”,因为您不需要它):
FROM base
(....)
但是如果你真的需要引用以前构建的图像(多阶段),可以使用--copy-from 0
(0,1,2,因为它对应,而不是别名)
詹金斯的相关问题
编辑
在此记录OP发现的解决方案:
我没有使用Jenkinsfile管道文件,而是在Jenkins作业中执行Shell来执行Docker构建命令。 (docker build -t latest-build。)
我遇到了这个问题,因为我正在使用--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
我有一堆可用的解决方法:
docker pull openjdk:8
,确保图像可用--target=BUILD
命令中删除docker.build
并让它构建整个东西(对我来说不是太大的交易,因为构建是最昂贵的部分)docker.build
和sh "docker build --target=BUILD .
目前我不确定我会选哪一个
我遇到了Docker 18.09的同样问题,但我没有使用多阶段构建。就我而言,我得到了:
java.io.IOException: Cannot retrieve .Id from 'docker inspect centos:7'
我的Dockerfile的第一步是:
FROM centos:7
我能用docker pull centos:7
修复问题;之后,Jenkins构建成功完成。