二丫讲梵 二丫讲梵
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)

二丫讲梵

行者常至,为者常成
首页
  • 最佳实践
  • 迎刃而解
  • Nginx
  • Php
  • Zabbix
  • AWS
  • Prometheus
  • Grafana
  • CentOS
  • Systemd
  • Docker
  • Rancher
  • Ansible
  • Ldap
  • Gitlab
  • GitHub
  • Etcd
  • Consul
  • RabbitMQ
  • Kafka
  • MySql
  • MongoDB
  • OpenVPN
  • KVM
  • VMware
  • Other
  • ELK
  • K8S
  • LLM
  • Nexus
  • Jenkins
  • 随写编年
  • 家人物语
  • 追忆青春
  • 父亲的朋友圈
  • 电影音乐
  • 效率工具
  • 博客相关
  • Shell
  • 前端实践
  • Vue学习笔记
  • Golang学习笔记
  • Golang编程技巧
  • 学习周刊
  • Obsidian插件周刊
关于
友链
  • 本站索引

    • 分类
    • 标签
    • 归档
  • 本站页面

    • 导航
    • 打赏
  • 我的工具

    • 备忘录清单 (opens new window)
    • json2go (opens new window)
    • gopher (opens new window)
    • 微信MD编辑 (opens new window)
    • 国内镜像 (opens new window)
    • 出口IP查询 (opens new window)
    • 代码高亮工具 (opens new window)
  • 外站页面

    • 开往 (opens new window)
    • ldapdoc (opens new window)
    • HowToStartOpenSource (opens new window)
    • vdoing-template (opens new window)
GitHub (opens new window)
  • 最佳实践

  • 迎刃而解

  • Nginx

  • Php

  • Zabbix

  • AWS

  • Prometheus

  • Grafana

  • Loki

  • CentOS

  • Supervisord

  • Systemd

  • Docker

    • 从DockerHub到阿里云镜像仓库:整理汇总我同步过的docker镜像(公开可匿名pull)
    • docker的几种安装方式
    • docker配置加速器的几种方案
    • docker搭建官方版私有仓库(了解)
    • Docker笔记之企业级仓库harbor搭建
    • 认识了解Dockerfile
    • 利用Dockerfile创建一些基础镜像
    • Docker笔记之与镜像相关的命令整理
    • 从docker容器时间问题探究到Namespace问题
    • Docker笔记之制作kafka镜像
    • Docker笔记之制作lnmp镜像
    • Docker笔记之使用apline镜像
    • Docker笔记之修改默认数据存储目录
    • Docker笔记之修改默认网段
    • docker磁盘或者镜像清理相关内容
    • centos镜像添加chrome浏览器以及中文字体
    • 利用buildx构建支持多CPU架构平台的docker镜像
    • docker exec命令中含有通配符执行失败的问题
    • Docker 调试构建失败的 Dockerfile 的方法
      • 原理
      • 实践
    • Docker容器如何优雅地访问宿主机网络
  • Docker-Compose

  • Rancher

  • Ansible

  • OpenLdap

  • GitLab

  • GitHub

  • Etcd

  • Consul

  • RabbitMQ

  • Kafka

  • Mysql

  • MongoDB

  • OpenVPN

  • Kvm

  • VMware

  • 配置文件详解

  • Other

  • 运维观止
  • Docker
二丫讲梵
2022-10-22
目录

Docker 调试构建失败的 Dockerfile 的方法

文章发布较早,内容可能过时,阅读注意甄别。

# 原理

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

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

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

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

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

申明

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

Copyright 二丫讲梵 (opens new window) 版权所有

# 实践

有如下 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 指令已经正常执行,而且环境也是当时的现场,这个时候我们就可以基于当时的现场,进行后续指令的调试。

微信 支付宝
上次更新: 2024/09/26, 21:41:44
docker exec命令中含有通配符执行失败的问题
Docker容器如何优雅地访问宿主机网络

← docker exec命令中含有通配符执行失败的问题 Docker容器如何优雅地访问宿主机网络→

最近更新
01
睡着的人不关灯
06-12
02
学习周刊-总第215期-2025年第24周
06-12
03
学习周刊-总第214期-2025年第23周
06-05
更多文章>
Theme by Vdoing | Copyright © 2017-2025 | 点击查看十年之约 | 浙ICP备18057030号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式