-
之前我们学会了一个简单的镜像是如何使用Dockerfile来构建出来的,步骤已经列出来了,没有说明白的就是上次的Dockerfile的内容,如下
FROM nginx RUN echo "<h1>Welcome Docker !</h1>" > /usr/share/nginx/html/index.html
- 如果你了解一点Linux命令,那
echo
就知道是用来做什么的,那剩下的陌生的就剩下FROM & RUN
了 -
指定基础镜像:
FROM
- 这个命令是一个Dockerfile的基础,它用来指定一个基础的镜像,来作为我们搭建的基础镜像,之后的所有命令和构建都是在此基础镜像上进行构建
- 有一个特殊的,如下,表示一个空白镜像,就是不以任何镜像为基础镜像,适用于不需要运行时系统支持的操作
FROM scratch
- 因为是用来指定基础的,所以必须指定,并且必须是第一条命令
-
执行命令行:
RUN
- 首先这个命令有两种书写格式,一种就是前面说的
RUN <Linux命令>
,还有一种如下
RUN ["执行文件","参数1","参数2"]
- 每一个
RUN
命令都是在原有的基础镜像上新建一层,如下图
- 首先这个命令有两种书写格式,一种就是前面说的
-
下面是一个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
文件,那么他就修改不了了(意思有点不合适,记住把本层的副作用降到最低这一准则)