From a81e1afe327c05cca670bde104b228ad00534c0b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=B0=8F=E8=9A=82=E8=9A=81=E4=BA=91?= Date: Sat, 12 Sep 2026 10:29:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .jenkins/Dockerfile | 32 ++++++++++---------------------- 1 file changed, 10 insertions(+), 22 deletions(-) diff --git a/.jenkins/Dockerfile b/.jenkins/Dockerfile index 7a3a337..67cd4e0 100644 --- a/.jenkins/Dockerfile +++ b/.jenkins/Dockerfile @@ -6,7 +6,8 @@ # - builder 只编译依赖,装到 /opt/deps,不碰基础镜像的 Python 目录 # - runtime 继承基础镜像的 Python,只把依赖的 site-packages COPY 过来 # - MySQL 运行库(mariadb-connector-c)由基础镜像预置,runtime 无需重复安装 -# - 源码 COPY 放在 pip install 之后,保护依赖层缓存 +# - 用 COPY --chown 指定属主,避免额外的 chown 层 +# - 源码 COPY 放在依赖之后,保护依赖层缓存 # # 构建参数 # VAR_BASE_IMAGE 基础镜像 @@ -39,7 +40,8 @@ ARG VAR_PYTHON_PREFIX ARG VAR_PYTHON_SHORT_VERSION ARG VAR_PYFILE_PATH -# 基础镜像末尾是 esxi 用户,装包需切回 root +# 基础镜像末尾是 esxi 用户;dnf/pip 需要写系统目录和 /opt/deps, +# 所以这里仍需 root USER root LABEL MAINTAINER="djangoadmin@126.com" @@ -100,8 +102,6 @@ ARG VAR_PORT ARG VAR_PYFILE ARG VAR_PYFILE_PATH -USER root - LABEL MAINTAINER="djangoadmin@126.com" # 运行期环境变量 @@ -116,31 +116,19 @@ ENV PORT=${VAR_PORT} \ PYFILE=${VAR_PYFILE} \ PROFILES=${VAR_PROFILES} -# 运行期依赖 -# mariadb-connector-c 基础镜像已预置,无需重复安装 -# net-tools 按需保留,如不需要可删 -RUN set -eux; \ - sed -e 's|^mirrorlist=|#mirrorlist=|g' \ - -e 's|^#baseurl=http://dl.rockylinux.org/$contentdir|baseurl=https://mirrors.aliyun.com/rockylinux|g' \ - -i.bak /etc/yum.repos.d/*.repo; \ - dnf install -y --setopt=install_weak_deps=False net-tools; \ - dnf clean all; rm -rf /var/cache/dnf - # 把 builder 编译好的 site-packages 和可执行文件拷到基础镜像 Python 对应目录 # 目标路径必须与基础镜像 Python 的实际 site-packages 一致 -# 用 VAR_PYTHON_SHORT_VERSION 拼接,避免硬编码 python3.12 -COPY --from=builder /opt/deps/lib/python${VAR_PYTHON_SHORT_VERSION}/site-packages/ \ - ${VAR_PYTHON_PREFIX}/lib/python${VAR_PYTHON_SHORT_VERSION}/site-packages/ -COPY --from=builder /opt/deps/bin/ ${VAR_PYTHON_PREFIX}/bin/ +# 用 COPY --chown 指定属主,避免额外的 chown 层 +COPY --chown=esxi:esxi --from=builder \ + /opt/deps/lib/python${VAR_PYTHON_SHORT_VERSION}/site-packages/ \ + ${VAR_PYTHON_PREFIX}/lib/python${VAR_PYTHON_SHORT_VERSION}/site-packages/ +COPY --chown=esxi:esxi --from=builder /opt/deps/bin/ ${VAR_PYTHON_PREFIX}/bin/ WORKDIR /opt/apps # 拷项目源码(放在依赖之后,保护 pip 层缓存) # 建议配合 .dockerignore 排除 .git、__pycache__、本地虚拟环境等 -COPY ${VAR_PYFILE_PATH}/ ./ - -# 修正属主,保证 esxi 可读写源码和 Python 目录 -RUN chown -R esxi:esxi /opt/apps ${VAR_PYTHON_PREFIX} +COPY --chown=esxi:esxi ${VAR_PYFILE_PATH}/ ./ USER esxi EXPOSE ${PORT}