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

编写Dockerfiles的优秀实践

发布时间:2019-09-17 22:23:53 所属栏目:建站 来源:架构师之路
导读:本文档介绍了构建高效镜像的优秀实践和方法。 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脚本结合使用,允许它以类似于上面命令的方式运行,即使在启动工具时可能需要不止一个步骤。

(编辑:广西网)

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