This commit is contained in:
2026-09-12 10:29:02 +08:00
parent faa046bec9
commit a81e1afe32
+10 -22
View File
@@ -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}