Skip to content

Dockerfile 多阶段提交

命令讲解

FROM ubuntu:22.04 AS temp

  • 这行命令指定了当前 Dockerfile 使用的基础镜像是 ubuntu:22.04,并且给这个构建阶段命名为 temp。这里 AS temp 是为当前阶段命名,便于后续引用。
  • 为什么这样做? 这样做的好处是,你可以在后续的构建阶段通过这个名字(temp)引用当前阶段,来指定在当前阶段中需要的文件或环境。

COPY --from=temp /app/ /app/

是一个多阶段构建的命令,通常用来从一个之前的阶段(或镜像)复制文件到当前镜像中

  • COPY 命令用于将文件从一个位置复制到另一个位置。
  • --from=temp 表示文件要从名为 temp 的构建阶段复制过来。也就是说,它引用的是一个在之前的 Dockerfile 中定义的构建阶段。
  • /app/ 是源路径,表示要从 temp 阶段中的 /app/ 目录下复制文件。
  • /app/ 是目标路径,表示要把文件复制到当前阶段(tempa)的 /app/ 目录下。

详细

shell
#提交前
[root@docker02.oldboylinux.cn /ten]# docker images 
REPOSITORY   TAG           IMAGE ID       CREATED         SIZE
web          test02        046ffbf180ab   33 hours ago    662MB
[root@docker02.oldboylinux.cn /ten]# docker images 
REPOSITORY   TAG           IMAGE ID       CREATED          SIZE
web          ten03         c2982e4d8698   2 minutes ago    155MB
w

[root@docker02.oldboylinux.cn /ten]# cat Dockerfile 

# 第一阶段:构建 Tengine
# 使用 Ubuntu 22.04 作为构建环境的基础镜像
FROM ubuntu:22.04 AS tempa

# 设置镜像的作者标签
LABEL author=www.linuxpath.cn

# 创建 nginx 用户和用户组
# 这些用户和组将用于 Tengine 运行时的权限控制
RUN groupadd nginx && \
    useradd -g nginx nginx && \
    apt update && \
    apt-get install -y \
    wget \                            # 下载工具
    libssl-dev \                      # SSL 库
    make \                            # 构建工具
    gcc \                             # C 编译器
    pcre2-utils \                     # 正则表达式库
    libpcre3-dev \                    # PCRE 库
    zlib1g-dev \                      # 压缩库
    && wget -P /tmp/ http://tengine.taobao.org/download/tengine-3.1.0.tar.gz && \  # 下载 Tengine 源代码包
    cd /tmp && \                       # 进入 /tmp 目录
    tar xf tengine-3.1.0.tar.gz && \   # 解压下载的 tar 包
    cd tengine-3.1.0 && \             # 进入解压后的 Tengine 目录
    ./configure --prefix=/app/tools/tengine-3.1.0 \   # 配置 Tengine 安装路径
                --user=nginx \                      # 指定运行 Tengine 的用户
                --group=nginx \                     # 指定运行 Tengine 的用户组
                --with-http_ssl_module \            # 启用 SSL 支持
                --with-http_v2_module \             # 启用 HTTP/2 支持
                --with-http_realip_module \         # 启用真实 IP 模块
                --with-http_stub_status_module \    # 启用状态模块
                --with-http_mp4_module \            # 启用 MP4 支持
                --with-stream \                     # 启用流媒体支持
                --with-stream_ssl_module \          # 启用流媒体 SSL 支持
                --with-stream_realip_module \       # 启用流媒体真实 IP 支持
                --add-module=modules/ngx_http_upstream_check_module/ \  # 添加模块:上游服务器健康检查模块
                --add-module=modules/ngx_http_upstream_session_sticky_module && \  # 添加模块:会话粘性模块
    make -j$(nproc) && \              # 使用所有 CPU 核心进行并行构建
    make install && \                 # 安装编译好的文件
    rm -rf /tmp/* /var/lib/apt/lists/*  # 清理临时文件和 apt 缓存,以减少镜像体积

# 第二阶段:最终镜像
# 使用 Ubuntu 22.04 作为运行时环境的基础镜像
FROM ubuntu:22.04

# 设置镜像的作者标签
LABEL author=www.linuxpath.cn

# 复制构建阶段的 Tengine 文件到最终镜像中

# --from=temp 表示复制从第一阶段构建的文件
COPY --from=temp /app/ /app/

# 安装运行 Tengine 所需的依赖
RUN groupadd nginx && \                 # 创建 nginx 用户组
    useradd -g nginx nginx && \          # 创建 nginx 用户
    apt update && \                      # 更新 apt 缓存
    apt-get install -y \                  # 安装必需的工具和库
    wget \
    libssl-dev \
    pcre2-utils \
    libpcre3-dev \
    zlib1g-dev && \
    # 创建软链接,方便后续使用 Tengine
    ln -s /app/tools/tengine-3.1.0 /app/tools/tengine && \   # 创建 Tengine 安装目录的符号链接
    ln -s /app/tools/tengine/sbin/nginx /sbin/ && \            # 将 nginx 命令链接到 /sbin/
    rm -fr /var/cache/* /var/lib/apt/* /tmp/* /var/lib/apt/lists/* && \  # 清理不必要的缓存和临时文件
    ln -sf /dev/stdout /app/tools/tengine/logs/access.log && \    # 将访问日志输出到标准输出
    ln -sf /dev/stderr /app/tools/tengine/logs/error.log         # 将错误日志输出到标准错误

# 设置工作目录,确保后续命令在该目录下运行
WORKDIR /app/tools/tengine

# 暴露容器的 80 和 443 端口,供外部访问
EXPOSE 80 443

# 启动 Nginx,-g "daemon off;" 参数确保 Nginx 在前台运行,以保持容器持续运行
CMD ["nginx", "-g", "daemon off;"

感谢阅读,欢迎交流!