自动化镜像构建Dockerfile的详解

什么是Dockerfile?

Dockerfile 是一个文本文件,包含一组指令,用于自动化构建Docker镜像。每条指令会创建一个新的镜像层,最终组合成一个完整的容器运行环境。

Dockerfile 核心指令详解

1. ​FROM
FROM ubuntu:20.04
  • 作用:指定基础镜像(必须为第一条指令)
  • 注意
    • 尽量使用官方镜像
    • 指定精确的版本号应该避免使用 latest
    • 推荐使用Alpine或Slim镜像减小体积

Alpine 镜像​:基于 Alpine Linux,采用轻量级的 musl libc 和 BusyBox,基础镜像仅 ​5-10 MB,远小于传统发行版。

Slim 镜像:基于 Debian 的精简版本,仅保留核心运行环境,体积通常为 ​50-100 MB​比完整版小 60% 以上。

2. ​LABEL
LABEL maintainer="your@email.com"
LABEL version="1.0"
  • 作用:添加元数据(非必须,但推荐),更推荐在 docker build 时通过 --label 参数添加
3. ​ENV
ENV APP_HOME=/app \
    NODE_ENV=production
  • 作用:设置环境变量(会被持久化到镜像中)
  • :敏感信息(如密码)不要用ENV,应通过 docker run -e 传入
4. ​WORKDIR
WORKDIR /app
  • 作用
    • 设置工作目录类似cd命令
    • 如果目录不存在会自动创建
  • ​注意始终使用绝对路径
5. ​COPY
COPY package.json .
COPY src/ ./src/
COPY --chown=user:group files/ /destination/
  • 作用:复制本地文件到镜像
  • 注意
    • 第一个参数是构建上下文中的路径
    • 可使用 .dockerignore 文件过滤不需要的文件
    • 与 ADD 的区别:ADD 可以解压tar包和下载URL,但推荐优先使用 COPY
6. ​RUN
RUN apt-get update && \
    apt-get install -y \
    git \
    curl \
    && rm -rf /var/lib/apt/lists/*
  • 作用
    • 执行命令并创建新镜像层
    • 避免运行后台进程(Dockerfile中的命令需立即完成)
    • 及时清理临时文件(如apt缓存)
    • 合并多个命令到一行
7. ​EXPOSE
EXPOSE 8080
  • 作用只是声明容器运行时监听的端口(实际映射需要在 docker run 时通过 -p 参数指定)
  • :仅用于文档说明,不会自动开启端口映射
8. ​CMD
CMD ["python", "app.py"]  #json格式
CMD python app.py     #shell格式
  • 作用:指定容器启动时的默认命令(可被 docker run 参数覆盖)
  • 格式:推荐使用exec格式​(JSON数组)
  • 注意:一个Dockerfile只能有一个有效的CMD,即执行完第一个CMD不会再执行其他的CMD
9. ​ENTRYPOINT
ENTRYPOINT ["python"]
CMD ["app.py"]
  • 作用:设置容器的主程序(不可被覆盖)
  • 组合使用:CMD 作为 ENTRYPOINT 的默认参数
  • 使用场景:制作"可执行"的镜像(如 docker run my-image --help
10. ​USER
USER nobody
  • 作用:指定运行容器的用户生产环境应为非root用户,增强安全性
  • 前提:需要先在镜像中创建用户(通过 RUN useradd

构建Nginx的Dockerfile示例

1.dockerfile
# 使用官方Nginx Alpine镜像(轻量级)
FROM nginx:1.25-alpine


# 使用LABEL写维护者标签
LABEL maintainer="your@email.com"
LABEL description="Custom Nginx container with security enhancements"

# 设置环境变量
ENV NGINX_PORT=80 \
    NGINX_ROOT=/usr/share/nginx/html \
    TZ=Asia/Shanghai

# 安装必要的工具(生产环境可跳过)
RUN apk update && \
    apk add --no-cache \
    curl \
    tzdata && \
    # 清理缓存
    rm -rf /var/cache/apk/* && \
    # 创建日志目录(Alpine默认已创建)
    mkdir -p /var/log/nginx && \
    # 修改Nginx运行用户为nginx(官方镜像已自带nginx用户)
    chown -R nginx:nginx /var/log/nginx

# 设置工作目录
WORKDIR ${NGINX_ROOT}

# 复制自定义配置文件
COPY nginx.conf /etc/nginx/nginx.conf
COPY conf.d/default.conf /etc/nginx/conf.d/default.conf

# 复制静态文件(使用.dockerignore过滤不需要的文件)
COPY ./src/ .

# 暴露端口(建议与配置中的监听端口一致)
EXPOSE ${NGINX_PORT}

# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
    CMD curl -f http://localhost:${NGINX_PORT} || exit 1

# 以非root用户运行(官方镜像已配置nginx用户)
USER nginx

# 启动命令(使用exec形式)
CMD ["nginx", "-g", "daemon off;"]

 文件结构:

/my-nginx/
├── dockerfile
├── nginx.conf            # 主配置文件
├── conf.d/
│   └── default.conf      # 站点配置
├── src/                  # 静态文件目录
│   ├── index.html
│   └── assets/
└── .dockerignore         # 忽略文件
 2.构建镜像
docker build -t my-nginx:1.0 .
3.运行容器
# 基础运行
docker run -d -p 80:80 --name my-nginx my-nginx:1.0

# 带环境变量覆盖
docker run -d -p 8080:80 -e NGINX_PORT=80 --name my-nginx my-nginx:1.0

# 挂载配置文件(用于开发调试)
docker run -d \
    -p 80:80 \
    -v $(pwd)/src:/usr/share/nginx/html \
    -v $(pwd)/conf.d:/etc/nginx/conf.d \
    --name my-nginx \
    my-nginx:1.0
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值