dockerfile 的作用是将本地文件打包成docker镜像以供使用,这里详细说下他的个个参数
首先是FORM
FORM 是指定你的镜像是基于那个镜像之上运行的,一般来说就是写各种服务器的镜像名,比如nginx,ubuntu,apche等等。
FROM nginx
然后MAINTAINER,就是写作者,这里就可以写下你的大名了
MAINTAINER "hahahah"
接着 WORKDIR,WORKDIR指令为Dockerfile中的任何 RUN、CMD、ENTRYPOINT、COPY 和 ADD指令设置工作目录。如果WORKDIR不存在,即使在后续的Dockerfile指令中不使用它,也会创建它。
WORKDIR /www/wwwroot/test
WORKDIR指令可以在Dockerfile中多次使用。如果提供了一个相对路径,它将相对于前面的WORKDIR指令的路径。
WORKDIR /a
WORKDIR b
WORKDIR c
COPY和ADD
这里ADD其实就是COPY的加强版,作用就是把本地文件复制到docker镜像中的指定位置,ADD比较COPY还可以将本地目录改为一个链接,或者一个gzip, bzip2 以及 xz的压缩包,ADD会自动下载,解压。
ADD . /www/wwwroot/test
"."的意义是当前目录,这个操作就是将当前目录下的所有文件都复制到镜像中/www/wwwroot/test目录下。
RUN
RUN 的作用就是执行你的一个命令,然后将执行命令后镜像在原有的基础上新建一层,这里的话就要讲下docker的基础,分层镜像了。
首先docker镜像的本质是。一个docker镜像由多个可读的镜像层组成,然后运行的容器会在这个docker的镜像上面多加一层可写的容器层,任何的对文件的更改都只存在此容器层。因此任何对容器的操作均不会影响到镜像。
它的基础层就是你form的镜像,然后你每写一个run,它就加一层,所以过多无意义的层,会造成镜像膨胀过大。能够一次写完的就尽量只写一个run
FROM centos
RUN yum install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz
以上执行会创建 3 层镜像。可简化为以下格式:
FROM centos
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
CMD
类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:
CMD 在镜像打包好了,使用docker run的时候默认的命令
RUN 是在dockerfile镜像打包的时候运行,
CMD ["/bin/echo", "this is a echo test"]
CMD echo "this is a echo test"
但是这里有个问题,就是cmd里的这个“this is a echo test”是写死的,如果你想要在docker run的时候才输入想要echo的参数,那么就要用
ENTRYPOINT
在使用了ENTRYPOINT之后,CMD就不在是一个shell命令了,而是一个默认参数
CMD ["this is a echo test"]
ENTRYPOINT echo
这是时候如果你直接运行
docker run test
那么会输出
this is a echo test
如果你带上参数
docker run test hahahahah
就会输出
hahahahah