编写Dockerfiles的优秀实践
最后,ENV还可以用来配置常用的版本号,以便更轻易维护版本,如下例所示:
相同于在措施中行使常量变量(而不是硬编码值),这种要领应承您变动单个ENV指令,从而自动地在容器中神奇地弹出软件版本。 每个ENV行建设一个新的中间层,就像RUN呼吁一样。这意味着,纵然您在将来的层中打消了情形变量的配置,它如故保存在这个层中,而且它的值可以被转储。您可以通过建设一个Dockerfile(如下所示)来测试它,然后构建它。
为了防备这种环境产生,并真正打消对情形变量的配置,可以行使一个带有shell呼吁的RUN呼吁,在一个单层中配置、行使和打消对变量的配置。你可以用;和& &。假如行使第二种要领,而且个中一个呼吁失败,docker构建也会失败。这凡是是个好主意。行使作为Linux Dockerfiles的行连续字符可以进步可读性。您还可以将全部呼吁放入shell剧本中,并让RUN呼吁运行该shell剧本。
ADD 可能COPY 固然ADD和COPY在成果上是相似的,可是一样平常来说,COPY是首选的。这是由于它比ADD更透明,COPY只支持将当地文件根基复制到容器中,而ADD的一些特征(好比只当地的tar提取和长途URL支持)不是很有用。因此,ADD的最佳用途是将当地tar文件自动提取到映像中,如ADD rootfs.tar.xz / 。 假若有多个Dockerfile步调行使与上下文差异的文件,请别离复制它们,而不是一次所有复制。这确保只有在特定必要的文件产生变动时,每个步调的构建缓存才会失效(逼迫从头运行该步调)。 譬喻:
将COPY . /tmp/放到RUN前面,会使缓存失效??? 因为镜像的巨细很重要,因此凶猛阻挡行使ADD从长途url获取包;您应该行使curl或wget来取代。这样,你可以删除你不再必要的文件后,他们已经被提取出来,你不必要添加另一层在您的镜像。譬喻,你应该停止做以下工作:
假如不必要提取tar (文件、目次)的话,应该始终行使COPY。 ENTRYPOINT ENTRYPOINT的最佳用法是配置镜像的主呼吁,应承像运行该呼吁一样运行该镜像(然后行使CMD作为默认符号)。 让我们从呼吁行器材s3cmd的镜像示例开始: ENTRYPOINT ["s3cmd"] CMD ["--help"] 此刻,这个镜像可以像这样运行:
也可以传参数执行:
这很有效,由于镜像的名字可以同时作为对二进制文件的引用,如上面的呼吁所示。 ENTRYPOINT指令也可以与helper剧本团结行使,应承它以相同于上面呼吁的方法运行,纵然在启动器材时也许必要不止一个步调。 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |