一点个人理解
首先dockerfile的逻辑:
dockerfile是生成镜像用的docker指导书,docker build -t name . 是它的使用命令,name是生成镜像的名称,name后面空格后面跟的点是目录,点表示所在目录,build会在目录中找到dockerfile文件
首先,dockerfile的第一行肯定是from,就是基础镜像,如FROM centos:latest就是基于最新centos镜像,build会读取这块,从本地镜像中找到这个镜像,然后读入docker中,继续下一行,一般会有创建人信息如MAINTAINER TEST,然后就是操作命令,如RUN、ADD、COPY等,docker会在刚才读取的镜像基础上生成一个容器,使用该命令,并删除之前的镜像用这个容器生成一个新的镜像然后删除这个容器,再将这个镜像作为新的镜像并读入下一行命令。循环到最后的CMD命令,生成最终镜像并给它命名。所以我们有时建立失败的时候会看到images里面有一个name为none的镜像,那就是直到出错前生成的那个镜像。
下面是坑
1.dockerfile会将所在目录下所有文件放入tmp目录中的一个dockerduild-xxxx目录,其中.表示所在目录,只能用
./xxx/xxx使用目录下文件,不能使用其它路径
2.dockerfile有屏蔽文件列表,有时会出现这个文件明明在目录下却无法访问的情况,这时需要把文件打包然后
在镜像中解包使用,或者改名在镜像中改回来,或者找到dockerfile的屏蔽文件修改(这一步没有尝试)
3.dockerfile中切换用户后最好使用绝对路径访问。run cd 访问目录不会对后面的run生效,比如上一步run了
cd /usr/local,这时tar解压不设定-C的话会直接解压到/root目录下,如果压缩文件在/usr/local下不使用绝
对路径无法访问,其原因在于每一行RUN都是独立的镜像,dockerfile的本质就是镜像的叠加
4.如果build途中有问题导致build中断,不需要重新开始,查看docker images可以看到生成了一个名字为
<none>的镜像,使用 run -it 该镜像id bash可以进入镜像进行测试,重写一个dockerfile,from 写成该镜像
id可以从这个镜像的位置继续build
持续踩坑中