一文学会Dockerfile语法

接应上篇,续讲前文。今天咱来聊一下Dockerfile的使用 。html

 

虽然能够经过docker commit命令来手动建立镜像,可是经过Dockerfile文件,能够帮助咱们自动建立镜像,而且可以自定义建立过程。本质上,Dockerfile就是一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终建立一个新的镜像,简化了从头至尾的构建流程并极大地简化了部署工做。python

使用Dockerfile的优势:nginx

  • 像编程同样构建镜像,支持分层构建及缓存。
  • 能够快速而精确的从新建立镜像以便于维护和升级。
  • 便于持续集成。
  • 可在任何地方快速构建镜像。

 

1、Dockerfile构建镜像步骤程序员

 

一、建立Dockerfile文件,名字就是Dockerfiledocker

二、docker build Dockerfile所在路径 -t 镜像名称[:tag]编程

 

2、Dockerfile指令缓存

 

一、FORMbash

FORM指令是最重要的一个且必须为Dockerfile文件开篇的第一个非注释行,用于为映像文件构建过程指定基准镜像,后续的指令运行于此基准镜像所提供的运行环境。less

基准镜像能够是任务可用镜像文件,默认状况下,docker build会在docker主机上查找指定的镜像文件,若是不存在,则会从Docker Hub Registry上拉取所需的镜像文件。curl

也就是说,任何新建镜像必须基于已有的镜像进行构建。

 

格式:FROM 镜像名称[:tag]

例如:FROM ngxin

 

二、MAINTAINER

用于让Dockerfile制做者提供本人的详细信息,此指令位置不限,但推荐放置FROM以后。

格式:MAINTAINER 做者信息

例如:MAINTAINER "lsy"

 

三、LABLE

为镜像指定标签,会继承基础镜像的LABLE,若是key相同,则覆盖。可替代MAINTANIER使用。

 

格式:LABLE key1=value1 key2=value2

例如:LABLE author=lsy

四、RUN

指定要运行并捕获到新容器镜像中的命令,包括安装文件、建立文件等,在容器建立过程当中执行。

 

格式 :RUN 指令1 [&& 指令2]

 

注意:因为Dockerfile中每个指令都会建立一层,全部层一块儿构成新的镜像。若是指令过多的话,会变得很臃肿,增长构建时间,因此能够将指令合并执行

例如:RUN mkdir -p /usr/lsy && echo 'this is lsy file' > /usr/lsy/lsy.html

 

例以下面这个Dockerfile文件:

基于nginx建立一个镜像,并建立/usr/lsy目录并建立lsy.html文件

FROM nginx
MAINTAINER "lsy"
RUN mkdir -p /usr/lsy &&  echo 'this is lsy file' > /usr/lsy/lsy.html

  

使用命令进行构建

docker build ./ -t my_nginx_1:v1.1

  

 

能够看到,docker会一层层的进行构建。

 

启动镜像:

docker run --rm --name my_nginx_1 -it my_nginx_1:v1.1 /bin/bash

  

 

 

能够看到,容器中确实是执行了RUN指令。

 

五、COPY

将宿主机的文件或者目录拷贝到容器的文件系统中,需相对于Dockerfile的路径。

 

格式:COPY <src> <dest>

文件复制准则:

  1. <src>必须是build上下文的相对路径。
  2. <src>是目录的话,则内部文件或子目录会递归复制,可是目录自身不会被复制
  3. 若是指定多个src,则dest必须是一个目录,且必须以/结尾
  4. 目标路径若是不存在,则会自动建立

例如:把Dockerfile同目录的test.html文件拷贝到容器中的/usr/lsy目录中

FROM nginx
MAINTAINER "lsy"
RUN mkdir -p /usr/lsy &&  echo 'this is lsy file' > /usr/lsy/lsy.html
COPY ./test.html /usr/lsy

  

 

使用docker build对Dockerfile进行构建:

 

启动容器查看文件是否已拷贝:

 

六、ADD

功能与COPY相似,还可使用url规范从远程位置复制到容器中

 

格式 :ADD <source> <dest>

例如:ADD ./test.html /usr/lsy

ADD https://www.python.org/ftp/python/3.5.1/python-3.5.1.exe /temp/python-3.5.1.exe

 

七、WORKDIR

用于为其余Dockerfile指令(如 RUN、CMD)设置一个工做目录,而且还设置用于运行容器映像实例的工做目录。WORKDIR以后的指令都会基于设定的工做目录中运行。

 

格式:WORKDIR 路径

例如:将/usr/lsy设置为工做目录,而后在目录中建立一个a.html文件

FROM nginx
MAINTAINER "lsy"
RUN mkdir -p /usr/lsy
WORKDIR /usr/lsy
RUN touch a.html

  

使用docker build建立镜像

 

运行容器查看:

 

能够看到,进来容器就是在工做目录中,而且目录中有了须要建立的文件。

 

八、CMD

相似于RUN指令,CMD指令也可用于运行任何命令或应用程序,不过,二者的运行时间不一样。

RUN指令运行于 镜像建立过程当中,而CMD指令运行于基于Dockerfile构建出的镜像启动一个容器时。

CMD指令的目的在于为启动的容器指定默认要运行的程序,且其运行结束后,容器也将终止,不过CMD指令能够被docker run的命令行参数所覆盖。

Dockerfile中能够指定多个CMD命令,但只有最后一个才会生效。

 

格式:CMD <command>

CMD ['<executable>','<param1>','<param2>']

CMD ['<param1>','<param2>']

前两种语法跟RUN同样

第三种是用于为ENTERPOINT指令提供默认参数。

 

例如:CMD c:\Apache24\bin\httpd.exe -w

CMD ['/bin/bash','-c','c:\Apache24\bin\httpd.exe','-w']

 

九、ENTERPOINT

配置容器启动后执行的命令,而且不可被 docker run 提供的参数覆盖。每一个 Dockerfile 中只能有一个ENTRYPOINT,当指定多个时,只有最后一个起效。若是有CMD,则CMD的命令被看成参数传递给ENTERPOINT。

不过,docker run命令的--entrypoint选项的参数能够对Dockerfile中的ENTRYPOINT进行覆盖。

Dockerfile中可存在多个 ENTRYPOINT指令,但只有最后一个 才会执行。

 

格式:ENTRYPOINT <command>

ENTRYPOINT ['<executable>','<param1>','<param2>']

 

十、ENV

用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其余指令所调用。

调用格式为${variable_name}或$variable_name

 

格式:ENV key1=value1 key2=value2

ENV key value

 

十一、ARG

构建参数,做用于ENV相同,不一样的是ARG的参数只在构建镜像的时候起做用,也就是docker build的时候。

 

格式:ARG k=v

 

十二、EXPOSE

用来指定端口,是容器内的应用能够经过端口与外界交互

做用跟docker run 命令中的 -p 同样

 

格式:EXPOSE 端口

例如:EXPOSE 80


1三、VOLUME

用于在镜像中建立一个挂载点目录,以挂载Docker Host上的卷或其余容器上的卷

若是挂载点目录路径下此前的文件存在,docker run命令会在卷挂载完以后将此前的全部文件 复制到新挂载的卷中。

 

格式:VOLUME <路径>

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

 

1四、USER

用于执行后续命令的用户和用户组

 

格式 :USER 用户名[:用户组]

例如:USER root:root

 

1五、HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

 

格式:HEALTHCHECK [OPTIONS] CMD command

HEALTHCHECK NONE

第一个的功能是在容器内部运行一个命令来检查容器的健康情况

第二个的功能是在基础镜像中取消健康检查命令

 

[OPTIONS]的选项支持如下三中选项:

--interval=DURATION 两次检查默认的时间间隔为30秒

--timeout=DURATION 健康检查命令运行超时时长,默认30秒

--retries=N 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3

--start-period=DURATION 容器启动后多长时间开始执行,默认是0s

 

注意:

HEALTHCHECK命令只能出现一次,若是出现了屡次,只有最后一个生效。

 

CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值以下:

0: success - 表示容器是健康的

1: unhealthy - 表示容器已经不能工做了

2: reserved - 保留值

 

例如:定时 30s PING一下百度,若是PING失败,则返回1

FROM nginx
MAINTAINER "lsy"
HEALTHCHECK --timeout=3s \
        CMD curl -f http://localhost/ || exit 1

  

使用docker build构建镜像

 

运行容器,查看日志输出:

 

1六、ONBUILD

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程当中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了以前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

 

格式 :ONBUILD <其它指令>

 

1七、STOPSIGNAL

当容器退出时给系统发送什么样的指令

 

格式:STOPSIGNAL 指令

 

===============================

我是Liusy,一个喜欢健身的程序员。

获取更多干货以及最新消息,请关注公众号:上古伪神

若是对您有帮助,点个关注就是对我最大的支持!!!

相关文章
相关标签/搜索