dockerfile

dockerfile #

目标:

  • 更快的构建速度
  • 更小的 Docker 镜像大小
  • 更少的 Docker 镜像层
  • 充分利用镜像缓存
  • 增加 Dockerfile 可读性
  • 让 Docker 容器使用起来更简单

做法:

  • 编写 .dockerignore 文件

  • 容器只运行单个应用

  • 将多个 RUN 指令合并为一个

  • 基础镜像的标签不要用 latest

    • 如果你的确需要使用最新版的基础镜像,可以使用 latest 标签,否则的话,最好指定确定的镜像标签
  • 每个 RUN 指令后删除多余文件

    # 假设我们更新了 apt-get 源,下载,解压并安装了一些软件包,它们都保存在 /var/lib/apt/lists/ 目录中
    RUN apt-get update \
        && apt-get install -y nodejs \
        # added lines
        && rm -rf /var/lib/apt/lists/*
    
  • 选择合适的基础镜像 (alpine 版本最好)

    • alpine 是一个极小化的 Linux 发行版,只有 4MB,这让它非常适合作为基础镜像
  • 设置 WORKDIR 和 CMD

    FROM node:7-alpine
    
    # WORKDIR 指令可以设置默认目录,也就是运行 RUN / CMD / ENTRYPOINT 指令的地方。
    WORKDIR /app
    COPY . /app
    RUN npm install
    
    # CMD 指令可以设置容器创建是执行的默认命令。另外,你应该讲命令写在一个数组中,数组中每个元素为命令的每个单词。
    CMD ["npm", "start"]
    
  • 使用 ENTRYPOINT (可选)

  • 在 entrypoint 脚本中使用 exec

  • 优先使用 COPY,不使用 ADD

  • 合理调整 COPY 与 RUN 的顺序

    • 把变化最少的部分放在 Dockerfile 的前面,这样可以充分利用镜像缓存
    # 源代码会经常变化,则每次构建镜像时都需要重新安装 NPM 模块,这显然不是我们希望看到的。
    # 因此我们可以先拷贝 package.json,然后安装 NPM 模块,最后才拷贝其余的源代码。
    # 这样的话,即使源代码变化,也不需要重新安装 NPM 模块
    FROM node:7-alpine
    
    WORKDIR /app
    
    COPY package.json /app
    RUN npm install
    COPY . /app
    
    ENTRYPOINT ["./entrypoint.sh"]
    CMD ["start"]
    
  • 设置默认的环境变量,映射端口和数据卷
  • 使用 LABEL 设置镜像元数据
  • 添加 HEALTHCHECK

参考:


本文访问量

本站总访问量

本站总访客数