Dockerfile构建 - 可以忽略错误吗?

175

我有一个Dockerfile。在构建镜像时,出现了以下错误导致构建失败:

automake: error: no 'Makefile.am' found for any configure output
Error build: The command [/bin/sh -c aclocal && autoconf && automake -a] returned a non-zero code: 1

实际上是无害的。图书馆构建良好,但是Docker一旦收到此错误就会停止构建。我能否指示Docker忽略这个错误?

3个回答

336
当然。Docker只是根据Dockerfile中的RUN shell脚本返回的错误代码做出响应。如果你的Dockerfile包含如下内容:
RUN make

你可以用以下内容替换:

RUN make; exit 0

该命令总会返回0(成功)退出代码。不足之处在于,即使构建过程中实际上存在错误,您的镜像看起来也将成功构建。


4
当我尝试运行service php7-fpm start时,我来到了这里。它返回1并且运行失败;使用service php7-fpm start; service php7-fpm status就可以解决问题 - 这似乎也解决了构建过程中的一个问题,因为单独运行这两个命令都会出现问题。 - igorsantos07
我来到这里是因为尝试从源代码构建Qt5。它可以很好地构建,但是使用并发构建以及Qt构建过程中运行的构建时测试(有意失败)导致我的RUN命令退出错误(2)。希望这能解决问题! - Mr. Developerdude
啊,Laravel现在强制要求人们运行composer install……无论如何…… - Benyamin Limanto
1
如果我们想使用 COPY 而不是 RUN 呢?例如,忽略源/目标文件是否存在。 - mohammad hosein bahmani
将您的文件/目录的父目录复制到容器中,然后使用“RUN”语句中的脚本检查特定文件并将它们放置在适当的位置。 - larsks

65

对于那些图像中潜在错误不够无害以至于不能被察觉/记录下来的人可能会感兴趣。(另外,声望不够,无法发表评论,所以作为答案。)

如指出的那样,RUN make; exit 0 的缺点是你不知道是否构建失败了。因此,最好使用类似以下的内容:

make test 2>&1 > /where/ever/make.log || echo "There were failing tests!"

这样,您可以通过Docker镜像构建过程日志收到通知,并且您可以看到在make(或任何其他执行过程,不仅限于make)期间出了什么问题。


2
这是一个非常被低估的答案。我的使用情况是一些软件包列表无法访问,而 apt-get update -y 失败了。 - Silviu Burcea

54

如果你正在执行一系列命令,你也可以使用标准的bash忽略错误|| true,这很方便:

RUN <first stage> && <job that might fail> || true && <next stage>

3
正是我所需要的 :) 更好的做法是如果作业失败,则在下一阶段(清理)之后再次尝试。 - csomakk
1
我确实需要这样做,因为我知道特定的任务(dpkg)会失败,而下一步的“apt-get install -f”将修复所有缺失的依赖项。 - Ben L

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接