Dockerfile构建镜像的过程
 
1、从base镜像运行一个容器
2、执行一条指令,对容器进行修改
3、执行类似 docker commit的操作,生成一个新的镜像层
4、Docker在基于刚刚提交的镜像层运行一个新的容器
5、重复步骤 2-4 ,直到Dockerfile中所有指令执行完毕
 
 
root@docker-lab:~/docker# ls
Dockerfile
root@docker-lab:~/docker# cat Dockerfile
FROM centos
RUN uptime
RUN touch tmpfile
RUN ls /mnt2
root@docker-lab:~/docker# docker build -t centos-t1 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
latest: Pulling from library/centos
a02a4930cb5d: Already exists
Digest: sha256:184e5f35598e333bfa7de10d8fb1cebb5ee4df5bc0f970bf2b1e7c7345136426
Status: Downloaded newer image for centos:latest
---> 1e1148e4cc2c
Step 2/4 : RUN uptime
---> Running in f05e49595929
06:44:46 up 204 days, 22:07,  0 users,  load average: 0.02, 0.02, 0.00
Removing intermediate container f05e49595929
---> be8d26615578
Step 3/4 : RUN touch tmpfile
---> Running in ada319df9d43
Removing intermediate container ada319df9d43
---> acaccd0c45d3
Step 4/4 : RUN ls /mnt2    #    第一次build报错, ls /mnt2 执行失败
---> Running in 590fc8e2360c
ls: cannot access /mnt2: No such file or directory
The command '/bin/sh -c ls /mnt2' returned a non-zero code: 2
root@docker-lab:~/docker# docker build -t centos-t1 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
---> 1e1148e4cc2c    #    第二次build直接使用了之前成功build镜像层的缓存
Step 2/4 : RUN uptime
---> Using cache
---> be8d26615578    #    第二次build直接使用了之前成功build镜像层的缓存
Step 3/4 : RUN touch tmpfile
---> Using cache
---> acaccd0c45d3    #    第二次build直接使用了之前成功build镜像层的缓存
Step 4/4 : RUN ls /mnt2    #    第二次build报错, ls /mnt2 执行失败
---> Running in b17908bf7059
ls: cannot access /mnt2: No such file or directory
The command '/bin/sh -c ls /mnt2' returned a non-zero code: 2
root@docker-lab:~/docker# docker images -a    #    此处可以看到build前三个成功步骤生成的镜像层
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              be8d26615578        34 seconds ago      202MB
<none>              <none>              acaccd0c45d3        34 seconds ago      202MB
centos              latest              1e1148e4cc2c        4 weeks ago         202MB
root@docker-lab:~/docker# docker run -it acaccd0c45d3    #    进入最后一次成功的镜像层,查看失败原因,没有 /mnt2 目录
[root@9ae841c96c62 /]# ls /mnt2
ls: cannot access /mnt2: No such file or directory
[root@9ae841c96c62 /]# ls /
anaconda-post.log  dev  home  lib64  mnt  proc  run   srv  tmp      usr
bin                etc  lib   media  opt  root  sbin  sys  tmpfile  var
[root@9ae841c96c62 /]#
 
 

015、调试Dockerfile(2019-01-04 周五)的更多相关文章

  1. 第 3 章 镜像 - 015 - 调试 Dockerfile

    如何 debug Dockerfile 通过 Dockerfile 构建镜像的过程 从 base 镜像运行一个容器 执行命令对容器做修改 执行类似 docker commit 的操作,生成一个新的镜像 ...

  2. 2019.01.04 洛谷P4719 【模板】动态dp(链分治+ddp)

    传送门 ddpddpddp模板题. 题意简述:给你一棵树,支持修改一个点,维护整棵树的最大带权独立集. 思路: 我们考虑如果没有修改怎么做. 貌似就是一个sbsbsb树形dpdpdp,fi,0f_{i ...

  3. 2019.01.04 bzoj2962: 序列操作(线段树+组合数学)

    传送门 线段树基础题. 题意:要求维护区间区间中选择ccc个数相乘的所有方案的和(c≤20c\le20c≤20),支持区间加,区间取负. 由于c≤20c\le20c≤20,因此可以对于每个线段树节点可 ...

  4. 2019.01.04 洛谷 P4721 【模板】分治 FFT

    传送门 如同题目所描述的一样,这是一道板题. 题意简述:给你一个数组g1,2,...ng_{1,2,...n}g1,2,...n​并定义f0=1,fi=∑j=1ifi−jgjf_0=1,f_i=\su ...

  5. Tensorflow学习笔记2019.01.22

    tensorflow学习笔记2 edit by Strangewx 2019.01.04 4.1 机器学习基础 4.1.1 一般结构: 初始化模型参数:通常随机赋值,简单模型赋值0 训练数据:一般打乱 ...

  6. 调试 Dockerfile - 每天5分钟玩转 Docker 容器技术(15)

    包括 Dockerfile 在内的任何脚本和程序都会出错.有错并不可怕,但必须有办法排查,所以本节讨论如何 debug Dockerfile. 先回顾一下通过 Dockerfile 构建镜像的过程: ...

  7. Tensorflow学习笔记2019.01.03

    tensorflow学习笔记: 3.2 Tensorflow中定义数据流图 张量知识矩阵的一个超集. 超集:如果一个集合S2中的每一个元素都在集合S1中,且集合S1中可能包含S2中没有的元素,则集合S ...

  8. AWS re:Invent(2019.01.09)

    时间:2019.01.09地点:北京国际饭店

  9. 2019/01/17 基于windows使用fabric将gitlab的文件远程同步到服务器(git)

    觉得django项目把本地更新push到gitlab,再执行fabric脚本从gitlab更新服务器项目挺方便的,当然从本地直接到服务器就比较灵活. 2019/01/17 基于windows使用fab ...

随机推荐

  1. Nagios 使用 NSClient++ 监控Windows Server

    在被监控的Windows server 主机上安装NSClinet++下载地址:https://www.nsclient.org/download/32bit:http://files.nsclien ...

  2. a span做成按钮样式不选中文字

    a,span做成按钮样式时,文字会被选中.加以下CSS可以让其不选中.测试三大浏览器都可以 .button { display: inline-block; -moz-user-select: non ...

  3. Glad You Came hdu-6356(ST表 || 线段树)

    第一种用线段树,用两颗数维护区间最大值和区间的最小值,然后更新的时候如果我目前区间内的最大值比我得到的v小,那么我就把这个区间修改成v,如果我的最小值比v大,那么v就是没有用的,直接跳过,然后这样每次 ...

  4. 【git】git一些命令使用记录

    目前git版本控制很多公司都在用,我把平时的使用做些记录,防止忘记. 1. 有时候分支比较多,我们会基于master建立一个新分支开发,有时候也会基于别的分支建立,但时间长了可能会忘记当前分支是基于哪 ...

  5. 一张图看懂JVM

    https://mp.weixin.qq.com/s?__biz=MzAxNjk4ODE4OQ==&mid=2247484432&idx=1&sn=381c98c49ffb81 ...

  6. Jupyter Notebook添加Ruby支持

    安装步骤 gem install iruby iruby register --force 参考资料:http://devopspy.com/linux/ruby-kernel-jupyter-not ...

  7. A1123. Is It a Complete AVL Tree

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  8. 数据库和Django model 生成和反向生成

    Django 脚本生成数据表 建立映射关系 如果询问时区时间,选1 然后输入timezone.now() python manage.py makemigrations (如果有子应用的话子应用名称填 ...

  9. python的异步IO模块

    asyncio模块:示例一 import asyncio @asyncio.coroutine def func1(): print('before...func1......') yield fro ...

  10. python 中深拷贝和浅拷贝的区别

    通俗的理解,浅就是外面,深就是里面.浅拷贝的意思就是只拷贝外面的一层,深拷贝就是拷贝的里面的所有. 看两段代码: 元组: #!/usr/bin/env/python # -*-coding:utf-8 ...