调试 Dockerfile - 每天5分钟玩转 Docker 容器技术(15)
2017-05-15 06:32
776 查看
包括 Dockerfile 在内的任何脚本和程序都会出错。有错并不可怕,但必须有办法排查,所以本节讨论如何 debug Dockerfile。
先回顾一下通过 Dockerfile 构建镜像的过程:
从 base 镜像运行一个容器。
执行一条指令,对容器做修改。
执行类似 docker commit 的操作,生成一个新的镜像层。
Docker 再基于刚刚提交的镜像运行一个新容器。
重复 2-4 步,直到 Dockerfile 中的所有指令执行完毕。
从这个过程可以看出,如果 Dockerfile 由于某种原因执行到某个指令失败了,我们也将能够得到前一个指令成功执行构建出的镜像,这对调试 Dockerfile 非常有帮助。我们可以运行最新的这个镜像定位指令失败的原因。
我们来看一个调试的例子。Dockerfile 内容如下:
![](http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170514-1494757981496010511.jpg)
执行
![](http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170514-1494757981605034160.jpg)
Dockerfile 在执行第三步 RUN 指令时失败。我们可以利用第二步创建的镜像 22d31cc52b3e 进行调试,方式是通过
![](http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170514-1494757981776053101.jpg)
手工执行 RUN 指令很容易定位失败的原因是 busybox 镜像中没有 bash。虽然这是个极其简单的例子,但它很好地展示了调试 Dockerfile 的方法。
到这里相信大家对 Dockerfile 的功能和使用流程有了比较完整的印象,但还没有系统学习 Dockerfile 的各种指令和实际用法,下节会开始这个主题。
先回顾一下通过 Dockerfile 构建镜像的过程:
从 base 镜像运行一个容器。
执行一条指令,对容器做修改。
执行类似 docker commit 的操作,生成一个新的镜像层。
Docker 再基于刚刚提交的镜像运行一个新容器。
重复 2-4 步,直到 Dockerfile 中的所有指令执行完毕。
从这个过程可以看出,如果 Dockerfile 由于某种原因执行到某个指令失败了,我们也将能够得到前一个指令成功执行构建出的镜像,这对调试 Dockerfile 非常有帮助。我们可以运行最新的这个镜像定位指令失败的原因。
我们来看一个调试的例子。Dockerfile 内容如下:
![](http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170514-1494757981496010511.jpg)
执行
docker build:
![](http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170514-1494757981605034160.jpg)
Dockerfile 在执行第三步 RUN 指令时失败。我们可以利用第二步创建的镜像 22d31cc52b3e 进行调试,方式是通过
docker run -it启动镜像的一个容器。
![](http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170514-1494757981776053101.jpg)
手工执行 RUN 指令很容易定位失败的原因是 busybox 镜像中没有 bash。虽然这是个极其简单的例子,但它很好地展示了调试 Dockerfile 的方法。
到这里相信大家对 Dockerfile 的功能和使用流程有了比较完整的印象,但还没有系统学习 Dockerfile 的各种指令和实际用法,下节会开始这个主题。
![](http://7xo6kd.com1.z0.glb.clouddn.com/upload-ueditor-image-20170514-1494757981889057644.jpg)
相关文章推荐
- 调试 Dockerfile - 每天5分钟玩转 Docker 容器技术(15)
- 调试 Dockerfile - 每天5分钟玩转 Docker 容器技术(15)
- 调试 Dockerfile - 每天5分钟玩转 Docker 容器技术(15)
- Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)
- Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)
- Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)
- Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)
- Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)
- Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)
- Dockerfile 构建镜像 - 每天5分钟玩转容器技术(13)
- Dockerfile 常用指令 - 每天5分钟玩转 Docker 容器技术(16)
- Docker 组件如何协作?- 每天5分钟玩转容器技术(8)
- 镜像命名的最佳实践 - 每天5分钟玩转 Docker 容器技术(18)
- RUN vs CMD vs ENTRYPOINT - 每天5分钟玩转 Docker 容器技术(17)
- 镜像的缓存特性 - 每天5分钟玩转 Docker 容器技术(14)
- 镜像的缓存特性 - 每天5分钟玩转 Docker 容器技术(14)
- Docker 架构详解 - 每天5分钟玩转容器技术(7)
- Docker 架构详解 - 每天5分钟玩转容器技术(7)
- Docker 组件如何协作?- 每天5分钟玩转容器技术(8)
- 镜像的缓存特性 - 每天5分钟玩转 Docker 容器技术(14)