Dockerfile介绍
Dockerfile 是什么?
Dockerfile 是一个文本文件,包含一系列用于构建 Docker 镜像的指令。它定义了如何基于基础镜像(如 ubuntu
、alpine
)逐步构建自定义镜像,包括安装依赖、配置环境、复制文件等操作。Docker 通过解析 Dockerfile 自动生成镜像,确保环境一致性和可复现性,是容器化应用的核心配置文件。
常用语法与指令详解
1. 基础指令(定义镜像元数据)
-
FROM <镜像名[:标签]>
指定基础镜像(必须为第一条指令)。FROM ubuntu:22.04 # 基于 Ubuntu 22.04 镜像
-
LABEL <键>=<值>
添加镜像元数据(如作者、版本)。LABEL maintainer="dev@example.com" version="1.0"
-
ENV <键>=<值>
设置环境变量(后续指令和容器运行时生效)。ENV APP_HOME=/app PORT=8080
2. 构建指令(操作镜像层)
-
RUN <命令>
在镜像中执行命令(每条RUN
生成一个新层)。RUN apt-get update && apt-get install -y curl # 安装 curl
-
WORKDIR <路径>
设置后续指令的工作目录(类似cd
)。WORKDIR $APP_HOME # 进入 /app 目录
-
COPY <源路径> <目标路径>
将宿主机文件复制到镜像中(支持通配符)。COPY ./src $APP_HOME/src # 复制本地 src 目录到容器 /app/src
-
ADD <源路径> <目标路径>
类似COPY
,但支持自动解压压缩包和远程 URL。ADD https://example.com/file.tar.gz /tmp/ # 下载并解压到 /tmp/
3. 容器运行时配置
-
EXPOSE <端口>
声明容器监听的端口(仅文档作用,需配合-p
映射到宿主机)。EXPOSE 8080 # 声明容器暴露 8080 端口
-
CMD ["可执行文件", "参数1", "参数2"]
指定容器启动时的默认命令(可被docker run
覆盖)。CMD ["nginx", "-g", "daemon off;"] # 启动 Nginx 前台运行
-
ENTRYPOINT ["可执行文件"]
定义容器启动时的入口命令(CMD
传递参数,--entrypoint
可覆盖)。ENTRYPOINT ["python"] # 默认执行 python CMD ["app.py"] # 实际命令为 python app.py
4. 多阶段构建(优化镜像体积)
通过多阶段构建减少最终镜像层数和依赖:
# 第一阶段:编译代码
FROM golang:1.21 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -o myapp
# 第二阶段:运行环境(仅复制编译结果)
FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/myapp .
CMD ["./myapp"]
关键注意事项
-
指令顺序优化
- 频繁变动的层(如代码)应放在
COPY
指令末尾,避免缓存失效。 - 示例:
FROM python:3.9 WORKDIR /app COPY requirements.txt . RUN pip install -r requirements.txt # 依赖层缓存 COPY . . # 代码层(变动时仅重建此层)
- 频繁变动的层(如代码)应放在
-
镜像体积控制
- 使用
.dockerignore
排除无关文件(如.git
、node_modules
)。 - 示例
.dockerignore
:.git node_modules *.log
- 使用
-
CMD
vsENTRYPOINT
CMD
:默认命令,可被docker run
覆盖(如docker run my-image /bin/bash
)。ENTRYPOINT
:强制入口命令,CMD
作为参数传递(适合固定入口场景)。
-
用户权限管理
- 避免以
root
运行容器,提升安全性:RUN useradd -m myuser USER myuser
- 避免以
最佳实践示例
场景:构建一个 Python Flask 应用镜像
# 使用官方 Python 基础镜像
FROM python:3.9-slim
# 设置环境变量(避免 Python 缓存)
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
# 创建工作目录并切换用户
WORKDIR /app
RUN useradd -m appuser && chown -R appuser:appuser /app
USER appuser
# 复制依赖并安装(利用缓存)
COPY --chown=appuser:appuser requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY --chown=appuser:appuser . .
# 暴露端口并启动应用
EXPOSE 5000
CMD ["gunicorn", "--bind", "0.0.0.0:5000", "app:app"]
总结
Dockerfile 通过声明式指令定义镜像构建流程,核心要点包括:
- 分层构建:每条指令生成一个镜像层,合理组织指令顺序可利用缓存。
- 多阶段构建:分离编译环境和运行环境,显著减小最终镜像体积。
- 安全配置:使用非 root 用户、最小化基础镜像、排除敏感文件。
掌握这些语法和实践后,可高效构建轻量级、可复用的容器镜像,适用于开发、测试和生产环境。
- 点赞
- 收藏
- 关注作者
评论(0)