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
参考:
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。