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

news2025/6/5 16:30:10

错误Dockerfile配置示例:

FROM python:3.11 as build

ENV http_proxy=http://172.17.0.1:7890
ENV https_proxy=http://172.17.0.1:7890

WORKDIR /app

ENV 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 release

COPY . .

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 release

WORKDIR /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: ./backend
      dockerfile: Dockerfile
      args:
        http_proxy: http://172.17.0.1:7890
        https_proxy: http://172.17.0.1:7890
    ports:
      - "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 /app

ENV 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 release

COPY . .

# 🔥 禁用运行阶段的代理(即使有也强行覆盖为空)
ENV http_proxy=""
ENV https_proxy=""

CMD ["python", "main.py"]

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

version: '3.8'

services:
  qdrant:
    image: qdrant/qdrant:latest
    container_name: qdrant
    ports:
      - 6333:6333
      - 6334:6334
    networks:
      - ragsaas-network

  mongodb:
    image: mongo:latest
    container_name: mongodb
    ports:
      - 27017:27017
    environment:
      MONGO_INITDB_ROOT_USERNAME: admin
      MONGO_INITDB_ROOT_PASSWORD: password
    networks:
      - ragsaas-network
    volumes:
      - mongodb_data:/data/db

  arizephoenix:
    image: arizephoenix/phoenix:latest
    container_name: arizephoenix
    ports:
      - '6006:6006'
      - '4317:4317'
    networks:
      - ragsaas-network

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
      args:
        http_proxy: http://172.17.0.1:7890
        https_proxy: http://172.17.0.1:7890
    image: ragsaas/backend:latest
    container_name: backend
    ports:
      - '8000:8000'
    environment:
      # MongoDB Configuration
      MONGODB_NAME: RAGSAAS
      MONGODB_URI: mongodb://admin:password@mongodb:27017/
      # Qdrant Configuration
      QDRANT_COLLECTION: default
      QDRANT_URL: http://qdrant:6333
      # QDRANT_API_KEY:
      OPENAI_API_KEY:
      # Backend Application Configuration
      MODEL_PROVIDER: openai
      MODEL: gpt-4o-mini
      EMBEDDING_MODEL: text-embedding-3-small
      EMBEDDING_DIM: 1536
      # FILESERVER_URL_PREFIX: http://backend:8000/api/files
      FILESERVER_URL_PREFIX: http://159.75.85.9:8000/api/files
      SYSTEM_PROMPT: 'You are a helpful assistant who helps users with their questions.'
      APP_HOST: 0.0.0.0
      APP_PORT: 8000
      ADMIN_EMAIL: admin@ragsaas.com
      ADMIN_PASSWORD: ragsaas
      JWT_SECRET_KEY: secret123
      JWT_REFRESH_SECRET_KEY: secret123
      ARIZE_PHOENIX_ENDPOINT: http://arizephoenix:6006
    depends_on:
      - qdrant
      - mongodb
      - arizephoenix
    networks:
      - ragsaas-network

  frontend:
    build:
      context: ./frontend
      dockerfile: Dockerfile
      args:
        HTTP_PROXY: http://172.17.0.1:7890
        HTTPS_PROXY: http://172.17.0.1:7890
        http_proxy: http://172.17.0.1:7890
        https_proxy: http://172.17.0.1:7890
    image: ragsaas/frontend:latest
    container_name: frontend
    ports:
      - '3000:3000'
    environment:
      # NEXT_PUBLIC_SERVER_URL: http://backend:8000
      # NEXT_PUBLIC_CHAT_API: http://backend:8000/api/chat
      NEXT_PUBLIC_SERVER_URL: http://159.75.85.9:8000
      NEXT_PUBLIC_CHAT_API: http://159.75.85.9:8000/api/chat
      HOST: 0.0.0.0  # 👈 关键配置,告诉 nextjs 启动时监听所有地址
    depends_on:
      - backend
    networks:
      - ragsaas-network

networks:
  ragsaas-network:
    name: ragsaas-network
    driver: bridge

volumes:
  mongodb_data:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2398119.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PH热榜 | 2025-06-03

1. Knowledge 标语:像认识朋友一样去销售给潜在客户,因为你其实了解他们! 介绍:Knowledge 是一个针对个人的销售智能平台,它利用行为数据和心理测评来识别市场上的潜在买家,并指导销售团队以最真实、最有…

论文略读: STREAMLINING REDUNDANT LAYERS TO COMPRESS LARGE LANGUAGE MODELS

2025 ICLR 判断模型层的重要性->剪去不重要的层(用轻量网络代替) 这种方法只减少了层数量,所以可以用常用的方法加载模型 层剪枝阶段 通过输入与输出的余弦相似度来判断各个层的重要性 具有高余弦相似度的层倾向于聚集在一起&#xff0c…

mapbox高阶,生成并加载等时图

👨‍⚕️ 主页: gis分享者 👨‍⚕️ 感谢各位大佬 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍⚕️ 收录于专栏:mapbox 从入门到精通 文章目录 一、🍀前言1.1 ☘️mapboxgl.Map 地图对象1.2 ☘️mapboxgl.Map style属性1.3 ☘️Fill面图层样式1.4 ☘️symbol符号图层…

DeepSeek眼中的文明印记:山海经

一、山海经到底是怎么回事? 《山海经》是中国古代一部极具神秘色彩的文化典籍,成书时间跨度较大(大致从战国至汉代),内容庞杂,涉及神话、地理、物产、巫术、医学、民俗等多个领域。关于它的性质&#xff0…

在Mathematica中实现Newton-Raphson迭代

为了寻找方程 可以使用Newton-Raphson迭代方法: NRIter[func_, xzero_, n_ : 5] :Module[{pointlist {}, x, xold xzero, xnew, f, df, xl, xr, k},f[x_] func[x];df[x_] D[func[x], x];Do[(pointlist Join[pointlist, {{xold, 0}}, {{xold, f[xold]}}];xnew …

【Ragflow】25.Ragflow-plus开发日志:excel文件解析新思路/公式解析适配

引言 RagflowPlus v0.3.0 版本中,增加了对excel文件的解析支持,但收到反馈,说效果并不佳。 以下测试文件内容来自群友反馈提供,数据已脱敏处理。 经系统解析后,分块效果如下: 可以看到,由于该…

Python数据可视化科技图表绘制系列教程(一)

目录 创建多个坐标图形(坐标系) 图表的组成 创建图形与子图 创建子图1 创建子图2 创建子图3 创建子图4 创建子图5 添加图表元素 极坐标图1 极坐标图2 【声明】:未经版权人书面许可,任何单位或个人不得以任何形式复制、…

移除3D对象的某些部分点云

1,目的 移除3D对象指定区域的点云。效果 2,原理。 通过投影剔除指定区域外的点云数据。 3,主要的算子。 3.1,gen_image_gray_ramp 是 Halcon 中用于生成‌线性灰度渐变图像‌的算子 功能概述‌ 数学原理‌ 生成的图像灰度值…

阿里云为何,一个邮箱绑定了两个账号

阿里云“幽灵账号”之谜:同一个邮箱注销后仍有两个账号?深度揭秘成因与终极解决方案! 你是否曾在阿里云上使用同一个邮箱注册过多个账号,明明已经**“彻底”注销了其中一个**,却惊愕地发现系统里依然**“幽灵般”挂着…

高效视频倍速播放插件推荐

软件介绍 本文介绍一款名为Global Speed的视频速度控制插件,该插件在插件市场评分极高,被公认为目前最好用的视频倍速插件之一。 插件安装与基本功能 安装Global Speed插件后,用户只需点击插件图标即可选择播放倍数,最高支持16…

无他相机:专业摄影,触手可及

在数字摄影时代,手机摄影已成为许多人记录生活、表达创意的重要方式。无他相机正是这样一款专为摄影爱好者设计的相机应用程序,它不仅提供了专业级摄影设备的大部分功能,还通过简洁直观的操作界面,让每一位用户都能轻松上手&#…

基于贝叶斯优化神经网络的光伏功率预测综述

基于贝叶斯优化神经网络的光伏功率预测综述 一、贝叶斯优化的基本原理与核心组件 贝叶斯优化(Bayesian Optimization, BO)是一种基于概率模型的全局优化方法,特别适用于高成本评估的黑盒函数优化问题。其核心由代理模型和采集函数构成&…

【C++11】折叠引用和完美转发

目录 一. 前言二. 引用折叠引用折叠的规则 三. 完美转发完美转发适用场景完美转发底层实现思考1思考2 一. 前言 在函数传参时,如果想保持某个参数的属性不改变,需要完美转发,而完美转发的实现需要折叠引用的帮助 二. 引用折叠 在语法上&am…

数据结构:递归:自然数之和

目录 递归解法 🔹第一步:定义本质问题 🔹第二步:分解问题结构 🔹第三步:定义初始条件 🔹第四步:递归思想的自然生成 循环解法 🔹第 1 步:定义问题最小…

网易 - 灵犀办公文档

一. 企业介绍 网易是中国领先的互联网技术公司,为用户提供免费邮箱、游戏、搜索引擎服务,通过开设新闻、娱乐、体育等30多个内容频道,以及博客、视频、论坛等互动交流,网聚人的力量。 为了给中小企业和个人打造一款综合性办公产…

【C++】模板与特化技术全面教程(claude sonnet 4)

第一章:模板的基础概念 (Template Fundamentals) 1.1 什么是模板? 模板 (Template) 是C中的一种泛型编程 (Generic Programming) 机制,它允许我们编写与类型无关的代码。想象一下,如果我们要为不同的数据类型编写相同逻辑的函数&a…

ABAP设计模式之---“高内聚,低耦合(High Cohesion Low Coupling)”

“高内聚、低耦合”是面向对象编程中非常重要的设计原则,它有助于提高代码的可维护性、扩展性和复用性。 1. 初衷:为什么会有这个原则? 在软件开发中,随着业务需求的复杂化,代码难免会变得越来越庞大。如果开发者将一…

RagFlow优化代码解析(一)

引子 前文写到RagFlow的环境搭建&推理测试,感兴趣的童鞋可以移步(RagFlow环境搭建&推理测试-CSDN博客)。前文也写过RagFLow参数配置&测试的文档,详见()。很少写关于具体代码的blog&#xff0c…

【python与生活】用 Python 从视频中提取音轨:一个实用脚本的开发与应用

在当今数字化的时代,视频内容无处不在。无论是学习教程、会议记录、在线讲座还是娱乐视频,我们每天都会接触到大量的视频资源。有时候,我们可能只对视频中的音频部分感兴趣,比如提取讲座的音频用于后续收听,或者从电影…

深度强化学习赋能城市消防优化,中科院团队提出DRL新方法破解设施配置难题

在城市建设与发展中,地理空间优化至关重要。从工业园区选址,到公共服务设施布局,它都发挥着关键作用。但传统求解方法存在诸多局限,如今,深度学习技术为其带来了新的转机。 近日,在中国地理学会地理模型与…