Dockerfile 详解
什么是Dockerfile
Dockerfile是一个文本文件,包含了一系列指令和参数,用于自动化构建Docker镜像。通过Dockerfile,我们可以定义镜像的内容和构建过程。
基本语法
Dockerfile使用特定的指令来定义镜像的构建步骤。每条指令都会在镜像中创建一个新的层。
常用指令
FROM
- 语法:
FROM <image>[:<tag>]
- 描述:指定基础镜像,必须是Dockerfile中的第一条指令
- 示例:
FROM ubuntu:20.04
WORKDIR
- 语法:
WORKDIR <path>
- 描述:设置工作目录
- 示例:
WORKDIR /app
COPY
- 语法:
COPY <src> <dest>
- 描述:将文件或目录从构建上下文复制到镜像中
- 示例:
COPY . /app
ADD
- 语法:
ADD <src> <dest>
- 描述:类似COPY,但支持URL和自动解压tar文件
- 示例:
ADD https://example.com/file.tar.gz /app/
RUN
- 语法:
RUN <command>
- 描述:在构建过程中执行命令
- 示例:
RUN apt-get update && apt-get install -y nodejs
ENV
- 语法:
ENV <key>=<value>
- 描述:设置环境变量
- 示例:
ENV NODE_ENV=production
EXPOSE
- 语法:
EXPOSE <port>
- 描述:声明容器运行时监听的端口
- 示例:
EXPOSE 80
CMD
- 语法:
CMD ["executable","param1","param2"]
- 描述:指定容器启动时执行的命令
- 示例:
CMD ["node", "app.js"]
ENTRYPOINT
- 语法:
ENTRYPOINT ["executable", "param1", "param2"]
- 描述:设置容器启动时执行的主程序
- 示例:
ENTRYPOINT ["nginx", "-g", "daemon off;"]
最佳实践
- 使用多阶段构建
# 构建阶段
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
# 运行阶段
FROM nginx:alpine
COPY /app/dist /usr/share/nginx/html
- 合并RUN指令
# 好的做法
RUN apt-get update && \
apt-get install -y \
nodejs \
npm
# 避免这样
RUN apt-get update
RUN apt-get install -y nodejs
RUN apt-get install -y npm
- 使用.dockerignore文件
node_modules
.git
*.log
- 设置适当的用户
RUN groupadd -r app && useradd -r -g app app
USER app
- 使用具体的标签版本
# 好的做法
FROM node:14.17.0
# 避免这样
FROM node:latest
注意事项
- 每个RUN指令都会创建新的层,应该合理组合命令以减少层数
- 在生产环境中应该使用多阶段构建来减小最终镜像的大小
- 合理使用缓存机制,将不经常变化的层放在前面
- 及时清理不需要的文件,特别是在RUN指令中
- 使用.dockerignore文件排除不需要的文件和目录