当前位置: 首页 > ai >正文

Dockerfile 使用多阶段构建(build 阶段 → release 阶段)后端配置

错误Dockerfile配置示例:

FROM python:3.11 as buildENV http_proxy=http://172.17.0.1:7890
ENV https_proxy=http://172.17.0.1:7890WORKDIR /appENV PYTHONPATH=/app# Install Poetry
# RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \
#     cd /usr/local/bin && \
#     ln -s /opt/poetry/bin/poetry && \
#     poetry config virtualenvs.create false# 安装 poetry:稳定方式
RUN apt-get update && apt-get install -y curl python3 python3-pip && \pip install --no-cache-dir poetry && \poetry config virtualenvs.create false# Install Chromium for web loader
# Can disable this if you don't use the web loader to reduce the image size
RUN apt update && apt install -y chromium chromium-driver# Install dependencies
COPY ./pyproject.toml ./poetry.lock* /app/
RUN poetry install --no-root --no-cache --only main# ====================================
FROM build as releaseCOPY . .CMD ["python", "main.py"]我这个配置文件应该如何修改

这里的 Dockerfile 使用了多阶段构建(build 阶段 → release 阶段),把代理设置在了 build 阶段的 ENV,但是这些设置会 默认被继承到下一阶段 release,导致运行时容器也在使用代理,从而触发 502 错误。


✅ 修改目标

  • 保持构建阶段使用代理(加速拉包等)✅
  • 确保运行阶段彻底清除代理(避免服务请求失败)✅

✅ 推荐修改后的 Dockerfile

# ============ 第一阶段:构建阶段(使用代理) =============
FROM python:3.11 as build# 传入构建参数(docker-compose.yml 或 docker build --build-arg)
ARG http_proxy
ARG https_proxy# 设置构建阶段使用代理
ENV http_proxy=${http_proxy}
ENV https_proxy=${https_proxy}WORKDIR /app
ENV PYTHONPATH=/app# 安装 Poetry 和依赖
RUN apt-get update && apt-get install -y curl python3 python3-pip && \pip install --no-cache-dir poetry && \poetry config virtualenvs.create false# 安装 Chromium(用于网页加载器)
RUN apt update && apt install -y chromium chromium-driver# 安装依赖(从缓存中尽量复用)
COPY ./pyproject.toml ./poetry.lock* /app/
RUN poetry install --no-root --no-cache --only main# ============ 第二阶段:运行阶段(干净无代理) =============
FROM python:3.11 as releaseWORKDIR /app
ENV PYTHONPATH=/app# 复制 build 阶段的包
COPY --from=build /usr/local /usr/local
COPY --from=build /app /app# 🔥 禁用运行阶段的代理(即使有也强行覆盖为空)
ENV http_proxy=""
ENV https_proxy=""CMD ["python", "main.py"]

✅ 配套修改 docker-compose.yml(传入构建代理)

services:backend:build:context: ./backenddockerfile: Dockerfileargs:http_proxy: http://172.17.0.1:7890https_proxy: http://172.17.0.1:7890ports:- "8000:8000"# ❌ 不要加 environment: 传 proxy 给运行阶段

✅ 检查是否生效

可以运行后进入容器测试:

docker-compose exec backend sh
printenv | grep -i proxy

结果应为:

http_proxy=
https_proxy=

说明运行阶段没有使用代理 ✅。


✅ 总结:关键改动点

位置改动内容原因
build 阶段ARG + ENV 设置代理仅限构建用
release 阶段不要继承代理,并显式清除避免运行阶段失败
docker-compose.yml仅传 build.args,不设置 environment控制代理作用范围

后端目录中Dockerfile文件配置示例(完整+正确版):

# ============ 第一阶段:构建阶段(使用代理) =============
FROM python:3.11 as build# 传入构建参数(docker-compose.yml 或 docker build --build-arg)
ARG http_proxy
ARG https_proxy# 设置构建阶段使用代理
ENV http_proxy=${http_proxy}
ENV https_proxy=${https_proxy}WORKDIR /appENV PYTHONPATH=/app# Install Poetry
# RUN curl -sSL https://install.python-poetry.org | POETRY_HOME=/opt/poetry python && \
#     cd /usr/local/bin && \
#     ln -s /opt/poetry/bin/poetry && \
#     poetry config virtualenvs.create false# 安装 poetry:稳定方式
RUN apt-get update && apt-get install -y curl python3 python3-pip && \pip install --no-cache-dir poetry && \poetry config virtualenvs.create false# Install Chromium for web loader
# Can disable this if you don't use the web loader to reduce the image size
RUN apt update && apt install -y chromium chromium-driver# 安装依赖(从缓存中尽量复用)
COPY ./pyproject.toml ./poetry.lock* /app/
RUN poetry install --no-root --no-cache --only main# ====================================
FROM build as releaseCOPY . .# 🔥 禁用运行阶段的代理(即使有也强行覆盖为空)
ENV http_proxy=""
ENV https_proxy=""CMD ["python", "main.py"]

docker-compose.yaml文件配置(完整版):

version: '3.8'services:qdrant:image: qdrant/qdrant:latestcontainer_name: qdrantports:- 6333:6333- 6334:6334networks:- ragsaas-networkmongodb:image: mongo:latestcontainer_name: mongodbports:- 27017:27017environment:MONGO_INITDB_ROOT_USERNAME: adminMONGO_INITDB_ROOT_PASSWORD: passwordnetworks:- ragsaas-networkvolumes:- mongodb_data:/data/dbarizephoenix:image: arizephoenix/phoenix:latestcontainer_name: arizephoenixports:- '6006:6006'- '4317:4317'networks:- ragsaas-networkbackend:build:context: ./backenddockerfile: Dockerfileargs:http_proxy: http://172.17.0.1:7890https_proxy: http://172.17.0.1:7890image: ragsaas/backend:latestcontainer_name: backendports:- '8000:8000'environment:# MongoDB ConfigurationMONGODB_NAME: RAGSAASMONGODB_URI: mongodb://admin:password@mongodb:27017/# Qdrant ConfigurationQDRANT_COLLECTION: defaultQDRANT_URL: http://qdrant:6333# QDRANT_API_KEY:OPENAI_API_KEY:# Backend Application ConfigurationMODEL_PROVIDER: openaiMODEL: gpt-4o-miniEMBEDDING_MODEL: text-embedding-3-smallEMBEDDING_DIM: 1536# FILESERVER_URL_PREFIX: http://backend:8000/api/filesFILESERVER_URL_PREFIX: http://159.75.85.9:8000/api/filesSYSTEM_PROMPT: 'You are a helpful assistant who helps users with their questions.'APP_HOST: 0.0.0.0APP_PORT: 8000ADMIN_EMAIL: admin@ragsaas.comADMIN_PASSWORD: ragsaasJWT_SECRET_KEY: secret123JWT_REFRESH_SECRET_KEY: secret123ARIZE_PHOENIX_ENDPOINT: http://arizephoenix:6006depends_on:- qdrant- mongodb- arizephoenixnetworks:- ragsaas-networkfrontend:build:context: ./frontenddockerfile: Dockerfileargs:HTTP_PROXY: http://172.17.0.1:7890HTTPS_PROXY: http://172.17.0.1:7890http_proxy: http://172.17.0.1:7890https_proxy: http://172.17.0.1:7890image: ragsaas/frontend:latestcontainer_name: frontendports:- '3000:3000'environment:# NEXT_PUBLIC_SERVER_URL: http://backend:8000# NEXT_PUBLIC_CHAT_API: http://backend:8000/api/chatNEXT_PUBLIC_SERVER_URL: http://159.75.85.9:8000NEXT_PUBLIC_CHAT_API: http://159.75.85.9:8000/api/chatHOST: 0.0.0.0  # 👈 关键配置,告诉 nextjs 启动时监听所有地址depends_on:- backendnetworks:- ragsaas-networknetworks:ragsaas-network:name: ragsaas-networkdriver: bridgevolumes:mongodb_data:
http://www.xdnf.cn/news/10735.html

相关文章:

  • 从Java的JDK源码中学设计模式之装饰器模式
  • 2021 RoboCom 世界机器人开发者大赛-高职组(复赛)解题报告 | 珂学家
  • C#学习12——预处理
  • 当 AI 超越人类:从技术突破到文明拐点的 2025-2030 年全景展望
  • Manus AI与多语言手写识别的创新革命:从技术突破到行业赋能
  • 第2章_Excel_知识点笔记
  • 第十三章 Java基础-特殊处理
  • 【iOS】多线程基础
  • ArrayList和LinkedList(深入源码加扩展)
  • Day-15【选择与循环】选择结构-if语句
  • Q:知识库-文档的搜索框逻辑是怎样的?
  • 解决VS Code误报Java问题的终极方法
  • 深入理解 Java 环境变量:从原理到实战配置指南
  • LangChain系列之LangChain4j集成Spring Bot
  • AI“实体化”革命:具身智能如何重构体育、工业与未来生活
  • Android 中的 DataBinding 详解
  • 在图像分析算法部署中应对流行趋势的变化|文献速递-深度学习医疗AI最新文献
  • 大模型赋能:金融智能革命中的特征工程新纪元
  • 兼容老设备!EtherNet/IP转DeviceNet网关解决储能产线通讯难题
  • Celery 核心概念详解及示例
  • 深入解析C++引用:从别名机制到函数特性实践
  • 【语义分割专栏】2:U-net原理篇(由浅入深)
  • Docker 在 AI 开发中的实践:GPU 支持与深度学习环境的容器化
  • 【结构型模式】装饰器模式
  • Nginx+Tomcat 负载均衡群集
  • Ubuntu 22.04 安装 Nacos 记录
  • WordPress 6.5版本带来的新功能
  • 腾讯 ovCompose 开源,Kuikly 鸿蒙和 Compose DSL 开源,腾讯的“双”鸿蒙方案发布
  • 云原生时代 Kafka 深度实践:05性能调优与场景实战
  • Vue3中Axios的使用-附完整代码