Dockerfile 最佳实践

实践建议

  • 添加 .dockerignore ,像添加 .gitignore 一样,屏蔽一些我们不用的文件
  • 避免安装必须的包
  • 每个容器都只开启一个进程,使用 link 来和其他容器交互
  • 最小化容器的layers
  • 使用 \ 将参数分为多行
  • 使用 build cache

命令最佳实践

  • FROM 建议使用 docker 官方镜像,基础镜像推荐Debian,这个镜像体积仅有100mb
  • RUN 尽可能保证可读性,参数的多的时候,使用 \ 进行分割
  • apt-get
    1. 避免RUN apt-get upgrade
    2. 使用 apt-get update && apt-get install -y 组合,分开会造成 cache 问题(有可能 apt-get update 不执行)
    3. 下面是一个比较好的方案,删除下载,可以减少 image 的大小
RUN apt-get update && apt-get install -y \  
    aufs-tools \
    automake \
    build-essential \
    curl \
    dpkg-sig \
    libcap-dev \
    libsqlite3-dev \
    mercurial \
    reprepro \
    ruby1.9.1 \
    ruby1.9.1-dev \
    s3cmd=1.1.* \
 && rm -rf /var/lib/apt/lists/*
  • CMD 使用这种方式 CMD [“executable”, “param1”, “param2”…]。好处是很明确的表明执行体
  • ENV 使用ENV PATH /usr/local/nginx/bin:$PATH,将一些命令加到 PATH 中。另外多使用 ENV 设置配置相关参数
  • ENTRYPOINT 可以配合 CMD 使用
ENTRYPOINT ["s3cmd"]  
CMD ["--help"]  
# 还可以使用 shell 脚本配合使用
COPY ./docker-entrypoint.sh /  
ENTRYPOINT ["/docker-entrypoint.sh"]  
  • USER
    不需要特殊权限,不使用 root 权限,可以使用gosu来更好的处理 root 相关的事情
RUN groupadd -r postgres && useradd -r -g postgres postgres  
  • WORKDIR 使用绝对地址,不然很容易产生错误和误解