惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Security Blog
Microsoft Security Blog
J
Java Code Geeks
GbyAI
GbyAI
aimingoo的专栏
aimingoo的专栏
L
LangChain Blog
I
InfoQ
D
Docker
F
Fortinet All Blogs
Y
Y Combinator Blog
Martin Fowler
Martin Fowler
月光博客
月光博客
B
Blog
Engineering at Meta
Engineering at Meta
T
Tailwind CSS Blog
罗磊的独立博客
博客园_首页
G
Google Developers Blog
Stack Overflow Blog
Stack Overflow Blog
Recent Announcements
Recent Announcements
D
DataBreaches.Net
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
B
Blog RSS Feed
IT之家
IT之家
V
V2EX

二丫讲梵

学习周刊-总第258期-2026年第15周 学习周刊-总第257期-2026年第14周 学习周刊-总第256期-2026年第13周 学习周刊-总第255期-2026年第12周 学习周刊-总第254期-2026年第11周 学习周刊-总第253期-2026年第10周 临时插播一条羊毛,免费领取450元大模型API代金券 学习周刊-总第252期-2026年第09周 学习周刊-总第251期-2026年第08周 学习周刊-总第250期-2026年第07周 学习周刊-总第249期-2026年第06周 诚邀评论,聊聊你所知欲知的我 学习周刊-总第248期-2026年第05周 我的QQ动态之2015年 我的QQ动态之2014年 我的QQ动态之2013年 我的QQ动态之2012年 我的QQ动态-2010-2011年 我的QQ动态-创栏小叙 学习周刊-总第247期-2026年第04周 Nexus社区版权益阉割--一文告诉你有哪些版本可以选择 学习周刊-总第246期-2026年第03周 学习周刊-总第245期-2026年第02周 学习周刊-总第244期-2026年第01周 学习周刊-总第243期-2025年第52周 学习周刊-总第242期-2025年第51周 开源项目ZenOps:带你领略禅意运维 学习周刊-总第241期-2025年第50周 用京东金融,享负债人生 学习周刊-总第240期-2025年第49周
Docker 调试构建失败的 Dockerfile 的方法
二丫讲梵 · 2022-10-23 · via 二丫讲梵

# 原理

当我们基于 Dockerfile 构建一个镜像的时候,不可避免的会遇到错误或失败,这个时候,通常我们会核查对应步骤执行的指令,然后调整指令,再次构建镜像,这是一种常规的方法。

其实,因为 Docker 底层存储的机制,我们可以直接进入到失败之前成功的那次状态中,然后二次调试我们的指令,从而做到有的放矢地验证。

docker 基于 Dockerfile 构建一个镜像的流程大致如下:

  1. 基于 FROM 的基础镜像运行一个临时容器
  2. 在临时容器当中,执行 Dockerfile 中定义的指令
  3. 然后执行类似 docker commit 的操作,生成一个全新的镜像层
  4. Docker 会再基于刚刚提交的镜像运行一个新容器
  5. 接着重复 2 ~ 4 步,直到 Dockerfile 中的所有指令执行完毕。

因此,当我们遇到构建失败的时候,只需要复原出错前一步的 Docker 容器,即可回溯到出错前的环境,然后再手动执行出错的命令来分析出错的原因即可。

申明

原创文章eryajf,未经授权,严禁转载,侵权必究!此乃文中随机水印,敬请读者谅解。

# 实践

有如下 Dockerfile 文件:

$ cat Dockerfile
FROM registry.cn-hangzhou.aliyuncs.com/eryajf/centos:7.5
RUN echo 'aaa' > /opt/test
RUN ehco 'bbb' >> /opt/test

1
2
3
4

这里可以看到,第三行指令的 echo 命令拼写有误,此时镜像构建日志如下:

$ docker build -t test .
Sending build context to Docker daemon  2.048kB
Step 1/3 : FROM registry.cn-hangzhou.aliyuncs.com/eryajf/centos:7.5
 ---> a290d4e5c19d
Step 2/3 : RUN echo 'aaa' > /opt/test
 ---> Running in 706e69349e9a
Removing intermediate container 706e69349e9a
 ---> ad3fb6309109
Step 3/3 : RUN ehco 'bbb' >> /opt/test
 ---> Running in bec27c733f58
/bin/sh: ehco: command not found
The command '/bin/sh -c ehco 'bbb' >> /opt/test' returned a non-zero code: 127

1
2
3
4
5
6
7
8
9
10
11
12

可以看到步骤 3 执行有异常,但是步骤 2 是正常执行的,我们可以执行如下命令拉起一个步骤 2 的环境:

$ docker run -it ad3fb6309109 cat "/opt/test"
aaa

1
2

如上命令可以看到第二行的 echo 指令已经正常执行,而且环境也是当时的现场,这个时候我们就可以基于当时的现场,进行后续指令的调试。