编写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脚本结合使用,允许它以类似于上面命令的方式运行,即使在启动工具时可能需要不止一个步骤。 (编辑:广西网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |