【Docker进阶】Dockerfile最佳实践(二)

jopen 7年前

本文是 Docker 入门教程第三章-DockerFile 的进阶篇第二部分。作者主要介绍了 Docker 的变化、常用指令以及基础镜像的最佳用法。

自从我上一篇 Dockerfile 最佳实践后,Docker 发生了很大变化。上一篇会继续保留用于造福 Docker 新手,这篇文章将介绍 Docker 有什么变化以及你现在应当做什么。

1:不要开机初始化

容器模型是进程而不是机器。即使你认为你需要开机初始化,那么你就错了。

2:可信任构建

即使你不喜欢这个题目但它是很棒的一功能。我把大部分 gihub 仓库添加到可信任构建,因此当我提交一个新镜像之后不久,正在等待索引。另外,我不必再创建单独的 Dockerfile 仓库与他人分享,它们都在同一个地方。

请记住,这不是你尝试新东西的试验场。在你推送之前,请在本地先构建一下。Docker 可以确保你在本地的构建和运行,与你推送到任何地方的构建和运行是一样的。本地开发和测试、提交和推送、以及等待索引上的官方镜像都是建立在可信任构建的基础之上的。

3:不要在构建中升级版本

更新将在基础镜像里,你不需要在您的容器内来apt-get upgrade更新。因为隔离情况下,如果更新时试图修改 init 或改变容器内的设备,更新可能会经常失败。它还可能会产生不一致的镜像,因为你不再有你的应用程序该如何运行以及包含在镜像中依赖的哪种版本的正确源文件。

如果基础镜像需要安全更新,那么让上游的知道,让他们给大家更新,并确保你再次构建的一致性。

4:使用小型基础镜像

有些镜像比其他的更臃肿。我建议使用debian:jessie作为你的基础镜像。如果你熟悉 ubuntu,你将发现一个更轻量和巧妙的自制 debian,它足够小并且没有包含任何不需要的包。

5:使用特定的标签

对于你的基础镜像这是非常重要的。Dockerfile 中FROM应始终包含依赖的基础镜像的完整仓库名和标签。比如说FROM debian:jessie而不仅仅是FROM debian。

6:常见指令组合

您的apt-get update应该与apt-get install组合。此外,你应该采取\的优势使用多行来进行安装。
#Dockerfile for https://index.docker.io/u/crosbymichael/python/   FROM debian:jessie    RUN apt-get update && apt-get install -y \  git \  libxml2-dev \  python \  build-essential \  make \  gcc \  python-dev \  locales \  python-pip    RUN dpkg-reconfigure locales && \  locale-gen C.UTF-8 && \  /usr/sbin/update-locale LANG=C.UTF-8    ENV LC_ALL C.UTF-8


谨记层和缓存都是不错的。不要害怕过多的层,因为缓存是大救星。当然,你应当尽量使用上游的包。

7:使用自己的基础镜像

我不是在谈论运行 debbootstrap 来制作自己的 debian。你不是 tianon(Tianon Gravi),没有人想要你认为别人需要的你的 500mb 的狗屎垃圾基础镜像。我说的是,如果你要运行 python 应用程序需要有一个python基础镜像。前面示例中用于构建crosbymichael/python的 Dockerfile 也被用于其他很多构建 Python 应用程序的镜像。
FROM crosbymichael/python    RUN pip install butterfly  RUN echo "root\nroot\n" | passwd root    EXPOSE 9191  ENTRYPOINT ["butterfly.server.py"]  CMD ["--port=9191", "--host=0.0.0.0"]


另一个:
FROM crosbymichael/python    RUN pip install --upgrade 油Tube_dl && mkdir /download  WORKDIR /download  ENTRYPOINT ["油Tube-dl"]  CMD ["--help"]


正如你看到的,这使得使用你的基础镜像非常小,从而使你集中精力在应用程序上。

让我知道你在想什么,或者如果您有任何其它问题,可以在评论中留言。

原文链接:Dockerfile Best Practices - take 2 (翻译:田浩 审校:叶可强)
来自:http://dockerone.com/article/132