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

编写Dockerfiles的优秀实践

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

最后,ENV还可以用来配置常用的版本号,以便更轻易维护版本,如下例所示:

  1. ENV PG_MAJOR 9.3 
  2. ENV PG_VERSION 9.3.4 
  3. RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && … 
  4. ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH 

相同于在措施中行使常量变量(而不是硬编码值),这种要领应承您变动单个ENV指令,从而自动地在容器中神奇地弹出软件版本。

每个ENV行建设一个新的中间层,就像RUN呼吁一样。这意味着,纵然您在将来的层中打消了情形变量的配置,它如故保存在这个层中,而且它的值可以被转储。您可以通过建设一个Dockerfile(如下所示)来测试它,然后构建它。

  1. FROM alpine 
  2. ENV ADMIN_USER="mark" 
  3. RUN echo $ADMIN_USER > ./mark 
  4. RUN unset ADMIN_USER 
  5. $ docker run --rm test sh -c 'echo $ADMIN_USER' 
  6. mark 

为了防备这种环境产生,并真正打消对情形变量的配置,可以行使一个带有shell呼吁的RUN呼吁,在一个单层中配置、行使和打消对变量的配置。你可以用;和& &。假如行使第二种要领,而且个中一个呼吁失败,docker构建也会失败。这凡是是个好主意。行使作为Linux Dockerfiles的行连续字符可以进步可读性。您还可以将全部呼吁放入shell剧本中,并让RUN呼吁运行该shell剧本。

  1. FROM alpine 
  2. RUN export ADMIN_USER="mark"  
  3. && echo $ADMIN_USER > ./mark  
  4. && unset ADMIN_USER 
  5. CMD sh 
  6. docker run --rm test sh -c 'echo $ADMIN_USER' 

ADD 可能COPY

固然ADD和COPY在成果上是相似的,可是一样平常来说,COPY是首选的。这是由于它比ADD更透明,COPY只支持将当地文件根基复制到容器中,而ADD的一些特征(好比只当地的tar提取和长途URL支持)不是很有用。因此,ADD的最佳用途是将当地tar文件自动提取到映像中,如ADD rootfs.tar.xz / 。

假若有多个Dockerfile步调行使与上下文差异的文件,请别离复制它们,而不是一次所有复制。这确保只有在特定必要的文件产生变动时,每个步调的构建缓存才会失效(逼迫从头运行该步调)。

譬喻:

  1. COPY requirements.txt /tmp/ 
  2. RUN pip install --requirement /tmp/requirements.txt 
  3. COPY . /tmp/ 

将COPY . /tmp/放到RUN前面,会使缓存失效???

因为镜像的巨细很重要,因此凶猛阻挡行使ADD从长途url获取包;您应该行使curl或wget来取代。这样,你可以删除你不再必要的文件后,他们已经被提取出来,你不必要添加另一层在您的镜像。譬喻,你应该停止做以下工作:

  1. ADD http://example.com/big.tar.xz /usr/src/things/ 
  2. RUN tar -xJf /usr/src/things/big.tar.xz -C /usr/src/things 
  3. RUN make -C /usr/src/things all 
  4. 我们用下面的呼吁代替: 
  5. RUN mkdir -p /usr/src/things  
  6. && curl -SL http://example.com/big.tar.xz  
  7. | tar -xJC /usr/src/things  
  8. && make -C /usr/src/things all 

假如不必要提取tar (文件、目次)的话,应该始终行使COPY。

ENTRYPOINT

ENTRYPOINT的最佳用法是配置镜像的主呼吁,应承像运行该呼吁一样运行该镜像(然后行使CMD作为默认符号)。

让我们从呼吁行器材s3cmd的镜像示例开始:

ENTRYPOINT ["s3cmd"]

CMD ["--help"]

此刻,这个镜像可以像这样运行:

  1. $ docker run s3cmd 

也可以传参数执行:

  1. $ docker run s3cmd ls s3://mybucket 

这很有效,由于镜像的名字可以同时作为对二进制文件的引用,如上面的呼吁所示。

ENTRYPOINT指令也可以与helper剧本团结行使,应承它以相同于上面呼吁的方法运行,纵然在启动器材时也许必要不止一个步调。

(编辑:湖南网)

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

热点阅读