diff --git a/.jenkins/Dockerfile b/.jenkins/Dockerfile index 4b3bd8e..cfbfaf5 100644 --- a/.jenkins/Dockerfile +++ b/.jenkins/Dockerfile @@ -10,7 +10,8 @@ ARG VAR_BASE_IMAGE # 阶段一:builder —— 负责编译依赖 # 说明: # - 这一阶段会安装 gcc/make/cmake 等编译工具 -# - 编译好的 Python 依赖会安装到 /install 前缀 +# - 编译好的 Python 依赖会安装到 Python 实际 prefix +# (即 /usr/local/python3.12.8) # - 最终该阶段整体被丢弃,编译工具不会进入 runtime 镜像 # ============================================================ FROM ${VAR_BASE_IMAGE} AS builder @@ -72,19 +73,21 @@ WORKDIR /opt/apps COPY ${VAR_PYFILE_PATH}/requirements.txt ./ # ------------------------------------------------------------ -# 将依赖安装到 /install 前缀,便于后续整体拷贝到 runtime -# --prefix=/install : 依赖会被装到 /install/lib/pythonX.Y/site-packages +# 将依赖安装到 Python 实际的 prefix +# --prefix=/usr/local/python3.12.8 : 基础镜像中 Python 的安装前缀 +# 用 python3 -m pip 保证使用同一个 Python 解释器 # uwsgi 单独安装(生产环境 WSGI 服务器) +# 注意:末尾不要多写反斜杠,否则会把下一行注释拼进来导致语法错误 # ------------------------------------------------------------ RUN python3 -m pip install --prefix=/usr/local/python3.12.8 -r requirements.txt && \ - python3 -m pip install --prefix=/usr/local/python3.12.8 uwsgi \ + python3 -m pip install --prefix=/usr/local/python3.12.8 uwsgi # ============================================================ # 阶段二:runtime —— 只保留运行时内容 # 说明: # - 不再安装 gcc/make/cmake 等编译工具 # - 只装运行时需要的动态库 -# - 从 builder 拷贝编译好的依赖 +# - 从 builder 拷贝编译好的 Python 及其依赖 # ============================================================ FROM ${VAR_BASE_IMAGE} AS runtime @@ -140,9 +143,9 @@ RUN yum install -y net-tools openssl-devel bzip2-devel libffi-devel mysql-devel yum clean all && rm -rf /var/cache/yum # ------------------------------------------------------------ -# 从 builder 阶段拷贝已编译好的 Python 依赖 -# /install 下的内容会被合并到 /usr/local -# 这样 pip 安装的包就能被 runtime 阶段的 python 找到 +# 从 builder 阶段拷贝 Python 及其已安装的依赖 +# 源和目标都使用 Python 的实际 prefix, +# 保证 runtime 的 Python 能在自己的 site-packages 里找到 Django 等包 # ------------------------------------------------------------ COPY --from=builder /usr/local/python3.12.8 /usr/local/python3.12.8 @@ -164,6 +167,13 @@ COPY ${VAR_PYFILE_PATH}/ ./ # ------------------------------------------------------------ RUN chown -R esxi:esxi /opt/apps +# ------------------------------------------------------------ +# 修正 Python 安装目录属主,保证 esxi 用户可访问 +# (builder 阶段以 root 安装依赖,属主是 root, +# runtime 阶段切换到 esxi 后可能无法写入) +# ------------------------------------------------------------ +RUN chown -R esxi:esxi /usr/local/python3.12.8 + # ------------------------------------------------------------ # 切回非 root 用户运行应用(安全加固) # ------------------------------------------------------------