Dockerfile详解及优化

 Dockerfile详解

0. Dockerfile的做用

docker能够根据Dockerfile中的指令来构建docker镜像。Dockerfile是一个文本文件,其应当包含用户想要构建一个镜像的全部指令。docker

1. 构建镜像的流程

真正执行构建任务的(就是读取Dockerfile中的指令构建新的镜像)是docker deamon。编程

  1. 执行  docker build -t images-name:tag . 
  2. docker client会先将 当前目录下的全部文件递归的发送给docker deamon
  3. docker deamon检查Dockerfile是否有有语法错误,有错误则中止构建并将错误发送给docker client,没有错误继续执行
  4. docker deamon根据Dockerfile中的指令,一行一行的进行镜像的构建
  5. 构建成功后,docker deamon自动清理context.

1. Dockerfile支持的指令

  • FROM  <image>[:tag]   #表明着一个新的build stage的开始,并肯定这个build是基于哪一个镜像来构建新的镜像,在全部的指令中只有这个是必需要有的。
  • ENV <key>=<value> | <key> <value>  #配置环境变量,注意此配置会在container中生效。前一种能够一行声明多个环境变量,后一种一行一个。
  • ARG <key>[=<value>]  #变量,此变量的声明周期与dockerfile构建过程一致,不会在container中生效。能够经过build时添加--build-arg <key>=<value>进行覆盖。注意:ARG时惟一能够放到FROM以前的指令,当ARG放到FROM以前时,它的做用于只到FROM这一行。
  • COPY src dest # 将src表明的文件或者文件夹拷贝到dest表明的目录下。src支持通配符* ?
  • ADD src dest #将src表明的文件或者文件夹或者网络资源 拷贝到 dest表明的base-image的目录下。src支持通配符 * ?
  • RUN command  #docker deamon在构建新的镜像时,是经过先基于FROM的镜像开启一个container,而后在这个container里执行。RUN指令就是是你想在container中执行的command。
  • ENTRYPOINT ["executable", "param1", "param2"] | command param1 param2 # 将镜像变成一个executable。推荐用CMD来代替。
  • CMD ["executable", "param1", "parama2"] | ["param1", "param2"] | command param1 param2 # 最后有一个CMD指令才有效,它表明这个image被用来建立container成功后执行的命令。第二种形式须要个ENTRYPOINT指令结合使用。
  • LABEL <key>=<value> <key>=<value> #表明着这个image的元信息,好比此image的描述,版本,做者信息等等。
  • EXPOSE port[/protocol] #经过这个image启动的container将会监听这些端口。可是注意这个只是在container内部监听的端口,当你想经过主机访问时须要在启动container时用-p这进行映射。
  • USER <user>[:<group>] | <UID>[:<GID>] #在这个指令以后的操做,以及运行container时,指定为此用户。
  • WORKDIR /path #在此指令以后的操做,以及container的默认进入路径都将时 /path目录。
  • VOLUME ['/path1', '/path2'] #基于此镜像建立的container都将拥有VOLUME中指定的挂在目录。注意映射的主机目录没法指定,有docker deamon自动生成,能够经过docker inspect查看Mounts属性。

2. Dockerfile编写优化

  1. 一个docker image只负责一个职责。当有多个服务时,请将服务分别docker化,而后组合使用这些docker images。缓存

  2. 就像编程同样,当一个字符串出现屡次时,请用ARG来声明变量取代hard code。网络

  3. 拷贝文件到镜像时,ADD负责网络资源的拷贝,COPY负责本地文件的COPY。优化

  4. 尽可能使用cache,docker在build镜像时能够利用缓存,缓存的原则时:当重复构建时,若是单个指令的内容没有变化,则docker会默认使用cache。ui

  5. 将相同变化频率的RUN指令合并成一个。注意,必定要是相同变化频率的RUN命令才能合并成一个,否则缓存的特性就没法使用了。spa

  6. 合理使用.dockerignore,减小images的体积。code

  7. 尽可能使用CMD,VOLUME将image进行服务化。递归

  8. 使用LABEL对image进行元信息的描述。资源

  9. 单一服务的基础镜像如何能够请使用alpine版本的镜像来减小image的体积。

相关文章
相关标签/搜索