Docker-Dockerfile入门 - 2

  1. 之前我们学会了一个简单的镜像是如何使用Dockerfile来构建出来的,步骤已经列出来了,没有说明白的就是上次的Dockerfile的内容,如下

    FROM nginx
    RUN echo "<h1>Welcome Docker !</h1>" > /usr/share/nginx/html/index.html
  2. 如果你了解一点Linux命令,那echo就知道是用来做什么的,那剩下的陌生的就剩下FROM & RUN
  3. 指定基础镜像: FROM

    • 这个命令是一个Dockerfile的基础,它用来指定一个基础的镜像,来作为我们搭建的基础镜像,之后的所有命令和构建都是在此基础镜像上进行构建
    • 有一个特殊的,如下,表示一个空白镜像,就是不以任何镜像为基础镜像,适用于不需要运行时系统支持的操作
    FROM scratch
    • 因为是用来指定基础的,所以必须指定,并且必须是第一条命令
  4. 执行命令行: RUN

    • 首先这个命令有两种书写格式,一种就是前面说的RUN <Linux命令>,还有一种如下
    RUN ["执行文件","参数1","参数2"]
    • 每一个RUN命令都是在原有的基础镜像上新建一层,如下图

Docker-Dockerfile入门 - 2

  • 下面是一个Dockerfile,它并不是一个可执行的Dockerfile,但是请仔细观察

    FROM nginx
    RUN apt-get update
    RUN apt-get install git
    RUN wget "https://xxx.tar"
    RUN ...
  • 如上是有问题的,并不是用法问题,而是思想问题,RUN了四次也就是在原有的nginx镜像上新建了四层,而我们的目的只是想构建好现在这个基础镜像,以便更方便的使用它,所以我们上面的操作就应该是在一层构建完成的,所以我们应该只是用一个RUN来把环境搭建好,如下

    FROM nginx
    RUN mysoft='git' \
        && apt-get update \
        && apt-get install $mysoft \
        && wget "https://xxx.tar"
        && <cache clean>
  • 相信你看完上面,就明白我要说什么了,其中刚开始的mysoft是我们定义的变量,而$mysoft就是引用其值,后面的<cache clean>是一些其他的推荐操作,比如更新系统下载下来的软件包清理掉
  • 我们使用RUN就要有这样的思想,我们是在定义每一层是如何构建的,保证无关的东西在本层删除掉
  • 记住并不是上一层不能更改或者触碰到下一层的相关文件,如果知道清理下一层什么文件这是可以清理的,比如这样

    FROM centos:latest
    RUN echo "first" > /hello
    RUN echo "second" >> /hello
    RUN rm -f /hello
  • 如上/hello在三次构建的时候都会被影响,而如果第二层不知道第一层有这个hello文件,那么他就修改不了了(意思有点不合适,记住把本层的副作用降到最低这一准则)
上一篇:YB002 - 概述


下一篇:Docker-commit