加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

编写Dockerfiles的优秀实践

发布时间:2019-09-17 13:58:00 所属栏目:建站 来源:架构师之路
导读:本文档先容了构建高效镜像的优越实践和要领。 Docker通过从Dockerfile(按次序包括构建给定镜像所需的全部呼吁的文本文件)读取呼吁来自动构建镜像。Dockerfile遵循特定的名目和一组呼吁,您可以在Dockerfile reference中找到这些呼吁。 Docker镜像由只读层

停止运行apt-get进级和distl -upgrade,由于来自父镜像的很多"根基"包无法在非特权容器中进级。假如父镜像中包括的包逾期了,请接洽它的维护职员。假如您知道有一个特定的包foo必要更新,那么行使apt-get install -y foo自动更新。

始终将RUN apt-get update与apt-get install组合在统一个RUN语句中。譬喻:

  1. RUN apt-get update && apt-get install -y  
  2. package-bar  
  3. package-baz  
  4. package-foo 

在RUN语句中单独行使apt-get update会导致缓存题目,随后的apt-get安装指令会失败。譬喻,假设您有一个Dockerfile:

  1. FROM ubuntu:18.04 
  2. RUN apt-get update 
  3. RUN apt-get install -y curl 

当构建完镜像后,全部的层都已经被缓存了,假设之后你修改了apt-get install 增进了其他的包:

  1. FROM ubuntu:18.04 
  2. RUN apt-get update 
  3. RUN apt-get install -y curl nginx 

Docker将初始指令和修改后的指令视为沟通的,并重用前面步调中的缓存。因此,apt-get更新不会执行,由于构建行使缓存的版本。因为apt-get更新没有运行,您的构建也许会获得一个过期版本的curl和nginx包。

行使RUN apt-get update && apt-get install -y确保您的Dockerfile安装最新的包版本,而无需进一步编码或手动过问。这种技能称为"缓存粉碎"。还可以通过指定包版原来实现缓存瓦解。这就是所谓的版本牢靠,譬喻:

  1. RUN apt-get update && apt-get install -y  
  2. package-bar  
  3. package-baz  
  4. package-foo=1.3.* 

版本牢靠逼迫构建以检索特定版本,而不管缓存中的内容是什么。这种技能还可以镌汰因为所需包中的不测变动而导致的妨碍。

下面是一个名目精采的运行指令,演示了全部apt-get 的优越实践。

  1. RUN apt-get update && apt-get install -y  
  2. aufs-tools  
  3. automake  
  4. build-essential  
  5. curl  
  6. dpkg-sig  
  7. libcap-dev  
  8. libsqlite3-dev  
  9. mercurial  
  10. reprepro  
  11. ruby1.9.1  
  12. ruby1.9.1-dev  
  13. s3cmd=1.1.*  
  14. && rm -rf /var/lib/apt/lists/* 

s3cmd指定了一个新的版本。假如之前的镜像安装的是一个旧的版本。apt-get update 会导致缓存失效,从而安装新的版本。

在这样的前提下,当你破除apt缓存而且移除/var/lib/apt/lists 目次,来减小文件尺寸。当RUN 声明以apt-get update开始,在执行apt-get install的时辰,缓存依然会被革新。

注:

Debian和ubuntu的官方镜像会自动运行apt-get clecn呼吁。以是不必要表现挪用。

行使管道

有些运行呼吁依靠于行使管道字符(|)将一个呼吁的输出管道到另一个呼吁的手段,如下例所示:

  1. RUN wget -O - https://some.site | wc -l > /number 

Docker行使/bin/sh -c表明器执行这些呼吁,表明器只计较管道中最后一个操纵的退出代码来确定是否乐成。在上面的示例中,只要wc -l呼吁乐成,纵然wget呼吁失败,这个构建步调就会乐成并天生一个新映像。

假如您但愿呼吁在管道中的任何阶段因为错误而失败,请预先配置-o pipefail &&,以确保不测错误防备构建不测乐成。譬喻:

  1. RUN set -o pipefail && wget -O - https://some.site | wc -l > /number 

注:

不是全部的shell都支持 –o pipfail 选项

在基于debian的镜像上行使dash shell的环境下,可以思量行使exec情势的RUN显式地选择一个支持pipefail选项的shell。譬喻:

  1. RUN ["/bin/bash", "-c", "set -o pipefail && wget -O - https://some.site | wc -l > /number"] 

CMD

CMD指令应该用于运行镜像所包括的软件,以及任何参数。CMD险些老是以CMD["executable"、"param1"、"param2"…]的情势行使。因此,假如镜像是用于处事的,好比Apache和Rails,您将运行相同CMD ["apache2","-DFOREGROUND "]的对象。现实上,对付任何基于处事的镜像,都保举行使这种情势的指令。

在大大都其他环境下,应该为CMD提供一个交互式shell,如bash、python和perl。譬喻,CMD ["perl"、"-de0"], CMD ("python"),或CMD ("php","-a")。行使这种情势意味着,当您执行像docker run - python这样的对象时,您将被放入一个可用的shell中,筹备停当。CMD应该很少与ENTRYPOINT一路以CMD ["param", "param"]的方法行使,除非您和您的预期用户已经很是认识ENTRYPOINT的事变方法。

EXPOSE

EXPOSE指令指示容器监听毗连的端口。因此,您应该为您的应用措施行使民众的、传统的端口。譬喻,包括Apache web处事器的镜像行使 80端口,而包括MongoDB的映像将行使 27017 端口,以此类推。

对付外部会见,用户可以行使一个符号执行docker run,该符号指示怎样将指定的端口映射到他们选择的端口。对付容器链接,Docker为从吸取留器返回到源容器的路径提供了情形变量(即MYSQL_PORT_3306_TCP)。

ENV

为了使新软件更轻易运行,可以行使ENV更新容器安装的软件的PATH情形变量。譬喻,ENV PATH /usr/local/nginx/bin:$PATH确保CMD ["nginx"]正常事变。

ENV指令对付提供特定于您但愿封装的处事的所需情形变量也很有效,好比Postgres的PGDATA。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读