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

错误Dockerfile配置示例:

yaml 复制代码
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

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(传入构建代理)

yaml 复制代码
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 给运行阶段

✅ 检查是否生效

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

bash 复制代码
docker-compose exec backend sh
printenv | grep -i proxy

结果应为:

复制代码
http_proxy=
https_proxy=

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


✅ 总结:关键改动点

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

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

swift 复制代码
# ============ 第一阶段:构建阶段(使用代理) =============
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文件配置(完整版):

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:
相关推荐
小张是铁粉1 小时前
docker学习二天之镜像操作与容器操作
学习·docker·容器
烟雨书信1 小时前
Docker文件操作、数据卷、挂载
运维·docker·容器
IT成长日记1 小时前
【Docker基础】Docker数据卷管理:docker volume prune及其参数详解
运维·docker·容器·volume·prune
这儿有一堆花1 小时前
Docker编译环境搭建与开发实战指南
运维·docker·容器
LuckyLay1 小时前
Compose 高级用法详解——AI教你学Docker
运维·docker·容器
Uluoyu1 小时前
redisSearch docker安装
运维·redis·docker·容器
IT成长日记5 小时前
【Docker基础】Docker数据持久化与卷(Volume)介绍
运维·docker·容器·数据持久化·volume·
热爱生活的猴子5 小时前
阿里云服务器正确配置 Docker 国内镜像的方法
服务器·阿里云·docker
FrankYoou9 小时前
Jenkins 与 GitLab CI/CD 的核心对比
java·docker
隆里卡那唔10 小时前
在dify中通过http请求neo4j时为什么需要将localhost变为host.docker.internal
http·docker·neo4j