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}