Appearance
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;"