Dockerfile指令详解

1、FROM指令

语法格式:

FROM    #是可选项,没有指定的话,表示使用latest

FROM :

说明:基于哪个镜像来构建新的镜像,FROM指令必须是dockerfile文件的第一行。
例如:FROM ubuntu:latest

2、MAINTAINER指令

语法格式:

MAINTAINER [作者信息]  

说明:这个指令用于声明作者,用于将image的制作者相关的信息写入到image中。

例如:MAINTAINER xuad或者MAINTAINER xuad.com

3、ENV指令

语法格式:

ENV     #设置一个环境变量

ENV = =...   #设置多个环境变量

说明:定义环境变量,永久变量,容器运行后仍然有效,即容器内的永久变量。
例如:ENV pashname /usr/local/nginx或者ENV pashname=/usr/local/nginx VERSION=1.0

4、ARG指令

语法格式:

ARG <参数名>   #不设置默认值的话,需要使用--build-arg来设置参数的值

ARG <参数名>[=<默认值>]   #设置参数的默认值

说明:定义参数,即临时变量,只限于构建镜像时使用,容器运行后是不会存在的。例如:ARG APT=apt-get*注:在构建命令docker build中用–build-arg <参数名>=<值> 可以覆盖此参数的值。*例如:docker build --build-arg APT=yum -t myip:v1

5、RUN指令

语法格式:

RUN 

RUN ["executable", "param1", "param2" ...]

说明:构建镜像时运行的shell命令例如:RUN yum install httpd或者RUN [“yum”, “install”, “httpd”]Dockerfile中每一个指令都会建立一层,RUN也不例外。多少个RUN就构建了多少层镜像,多个RUN会产生非常臃肿、多层的镜像,不仅仅增加了构建部署的时间,还容易出错。我们在写Dockerfile的时候,要尽量避免使用多个RUN,尽量将需要执行的命令都写在一个RUN里。多条命令可使用\来换行,换行的命令前面加上&&,最后还需要将不需要的文件及目录删除,比如安装包、临时目录等,减少容器的大小。*注:Union FS是有最大层数限制的,比如AUFS,曾经是最大不得超过42层,现在是不得超过127层。*以下是安装redis的一个例子:

FROM debian:jessie

RUN buildDeps='gcc libc6-dev make' \

  && apt-get update \

  && apt-get install -y $buildDeps \

  && wget -O redis.tar.gz "[http://download.redis.io/releases/redis-3.2.5.tar.gz](http://download.redis.io/releases/redis-3.2.5.tar.gz)" \

  && mkdir -p /usr/src/redis \

  && tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \

  && make -C /usr/src/redis \

  && make -C /usr/src/redis install \

  && rm -rf /var/lib/apt/lists/* \

  && rm redis.tar.gz \

  && rm -r /usr/src/redis \

  && apt-get purge -y --auto-remove $buildDeps

通过上面的命令我们可以看到后面添加的清理命令,删除了下载的安装包及解压出来的文件,删除了apt缓存文件,还卸载了编译安装所需要用到的软件。镜像是多层存储,每一层的东西都不会在下一层被删除,会一直跟随着镜像。因此在构建镜像时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉。

6、WORKDIR指令

语法格式:

WORKDIR <工作目录路径>

说明:指定工作目录,以后各层指令的当前目录就是此目录。例如:WORKDIR /usr/local/nginx注:如果目录不存在,WORKDIR会自动创建这个目录。

7、COPY指令

语法格式:

COPY <源路径>... <目标路径>

COPY ["<源路径1>",... "<目标路径>"]

说明:将上下文目录中的文件或目录复制到镜像内指定的目录下。例如:COPY nginx.conf /usr/local/nginx/conf/或者COPY [“nginx.conf”,“/usr/local/nginx/conf/”]注:源路径可以是多个,甚至可以使用通配符;目标路径可以是容器内的绝对路径,也可以是相对于WORKDIR指定的工作目录的相对路径。

8、ADD指令

语法格式:

ADD <源路径>... <目标路径>

ADD ["<源路径1>",... "<目标路径>"]

说明:更高级的复制指令,与COPY不同的是,针对压缩包会自动解压处理。例如:html.tar.gz /var/www/html或者ADD https://xuad.com/html.tar.gz /var/www/html注:源路径是一个压缩文件的话,将会解压到容器的目标路径下;源路径是一个URL的话,会下载或者解压到容器的目标路径下。

9、VOLUME指令

语法格式:

VOLUME <路径>

VOLUME ["<路径1>", "<路径2>"...]

说明:将本地卷挂载到容器中例如:VOLUME /data注:容器使用的是AUFS,这种文件系统不能持久化数据,当容器关闭后,所有的更改都会丢失。当数据需要持久化时使用VOLUME指令,向挂载目录里写入的任何信息都不会写进容器存储层,从而保证了容器存储层的无变化。

10、EXPOSE指令

语法格式:

EXPOSE <端口1> [<端口2>...]

说明:声明容器运行时提供的服务端口例如:EXPOSE 80 443注:docker run命令可使用-p <宿主端口>:<容器端口>将声明的端口映射到本地指定的端口,此处只是声明,在映射之前无法通过本地访问该端口。

11、USER指令

语法格式:

USER <用户名>

USER 

说明:指定运行的用户,以后各层的RUN、CMD或者ENTRYPOINT等指令都会以这个用户身份执行。

12、CMD指令

语法格式:

CMD <命令>

CMD ["可执行文件", "参数1", "参数2"...]

说明:容器运行时执行的shell命令,CMD指令一般应为Dockerfile文件的最后一行。
例如:CMD echo $HOME或者CMD [ “sh”, “-c”, “echo $HOME” ]
举个例子,启动nginx服务不能使用CMD systemctl start nginx,而应该使用CMD [“nginx”, “-g”, “daemon off;”]。因为docker会将CMD systemctl start nginx命令理解为CMD [“sh”, “-c”, “systemctl start nginx”],主进程实际上是sh,当systemctl start nginx命令执行完后,sh作为主进程退出了,自然容器也会退出。这就是为什么使用CMD systemctl start nginx指令,容器运行不起来的原因。正确的作法是将nginx以前台形式运行,即CMD [“nginx”, “-g”, “daemon off;”]。

13、ENTRYPOINT指令

语法格式:

ENTRYPOINT <命令>

ENTRYPOINT ["可执行文件", "参数1", "参数2"...]

说明:容器运行时执行的shell命令,一般应为Dockerfile文件的最后一行。例如:ENTRYPOINT [“nginx”, “-g”, “daemon off;”]*注:与CMD不同的是,当指定了ENTRYPOINT后,CMD不再是直接运行命令,而是将CMD的内容作为参数传给ENTRYPOINT指令。*例如在Dockerfile文件中同时写了ENTRYPOINT和CMD,而CMD指令不是一个完整的命令,而是一个参数,如下:

ENTRYPOINT ["nginx", "-g"]

CMD ["daemon off;"]

此时CMD的内容会作为参数传递给ENTRYPOINT,相当于ENTRYPOINT [“nginx”, “-g”, “daemon off;”]。
如果CMD是一个完整的命令,如下:

ENTRYPOINT ["nginx", "-g", "daemon off;"]

CMD echo $HOME

那么ENTRYPOINT和CMD指令会互相覆盖,谁在最后谁生效。即ENTRYPOINT “nginx”, “-g”, “daemon off;”]不会执行,执行的是CMD echo $HOME。

14、HEALTHCHECK指令

语法格式:

HEALTHCHECK [选项] CMD <命令>

HEALTHCHECK NONE   #如果基础镜像有健康检查指令,使用这行可以取消健康检查指令

说明:容器健康状态检查指令例如:HEALTHCHECK --interval=5s --timeout=3s CMD curl -fs http://localhost/ || exit 1

HEALTHCHECK的选项有:

–interval=<间隔>:两次健康检查的间隔时间,默认为30秒

–timeout=<时长>:每次检查的超时时间,超过这个时间,本次检查就视为失败,默认30秒

–retries=<次数>:指定健康检查的次数,默认3次,如果指定次数都失败后,则容器的健康状态为unhealthy(不健康)

CMD命令的返回值决定了本次健康检查是否成功,命令的返回值如下:0: success - 成功 1: unhealthy - 失败 2: reserved - 保留如果镜像添加了健康状态检查,容器运行后,在STATUS下会显示健康状态。

15、ONBUILD指令

语法格式:

ONBUILD <其它指令>

说明:指定以当前镜像为基础镜像构建的下一级镜像运行的命令例如:ONBUILD COPY ./package.json /app或者ONBUILD RUN [ “npm”, “install” ]注:在当前镜像构建时不会执行,只有以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

你可能感兴趣的:(docker,容器,docker,linux)