Dockerfile指令详解与最佳实践
基本结构
Dockerfile由指令行构成,支持以#开头的注释行。
核心结构包含四部分:基础镜像定义、元数据声明、镜像操作指令、容器启动指令。
完整配置示例
# 项目镜像构建示例
# 基础镜像(推荐轻量级镜像)
FROM nginx:1.21
# 元数据标签
LABEL maintainer="devops@example.com"
LABEL version="2.0" service="web-app"
# 环境变量设置
ENV APP_HOME /opt/service
ENV PYTHON_VER 3.9
ENV PATH $APP_HOME/bin:$PATH
# 工作目录设置
WORKDIR $APP_HOME
# 复制应用文件
COPY build/app.tar.gz $APP_HOME/
# 安装依赖
RUN apt-get update && apt-get install -y python$PYTHON_VER
RUN tar -xzf app.tar.gz && rm app.tar.gz
# 端口暴露
EXPOSE 80 443
# 数据卷声明
VOLUME ["/data/nginx", "/var/log"]
# 启动命令
ENTRYPOINT ["nginx", "-c"]
CMD ["/etc/nginx/nginx.conf"]
精简配置示例
FROM alpine:3.14
LABEL env="production"
ENV DEPLOY_DIR /usr/share/app
WORKDIR $DEPLOY_DIR
RUN apk add openjdk11
RUN ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
EXPOSE 8080
CMD echo "服务启动成功"
FROM adoptopenjdk:11-jre
COPY target/service.jar /app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
核心指令解析
FROM
定义基础镜像,格式:FROM <image>[:tag]
FROM ubuntu:20.04
LABEL
添加元数据标签,替代废弃的MAINTAINER
LABEL author="team@org.com" component="auth-service"
ENV
设置环境变量,作用域贯穿构建和运行时
ENV DB_HOST postgres-db
ENV MAX_THREADS 8
COPY/ADD
COPY复制本地文件,ADD支持URL和解压功能
COPY config.yaml /etc/service/
ADD https://example.com/data.tgz /tmp/
RUN
执行构建命令,推荐合并指令减少镜像层
RUN apt update \
&& apt install -y curl python3 \
&& rm -rf /var/lib/apt/lists/*
EXPOSE
声明容器监听端口,需配合运行时端口映射
EXPOSE 5432 6379
ENTRYPOINT
定义不可覆盖的主进程命令,与CMD配合使用
ENTRYPOINT ["python"]
CMD ["app.py"]
VOLUME
创建持久化数据挂载点
VOLUME ["/var/lib/mysql"]
USER
指定非root运行身份
RUN useradd -m appuser
USER appuser
WORKDIR
设置后续指令的工作路径
WORKDIR /var/www
ONBUILD
定义基础镜像被继承时触发的指令
ONBUILD COPY requirements.txt .
ONBUILD RUN pip install -r requirements.txt
