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: [email protected]
      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:
相关推荐
Jay_272 小时前
python项目如何创建docker环境
开发语言·python·docker
---wzy---2 小时前
docker生命周期
java·docker·容器
@t.t.4 小时前
使用Swarm工具搭建docker集群
docker·微服务·容器
局外人LZ5 小时前
Docker轻松搭建Neo4j+APOC环境
docker·容器·neo4j
大数据0015 小时前
Docker慢慢学
mysql·docker·kafka·n8n
唐可盐15 小时前
解决docker运行zentao 报错:ln: failed to create symbolic link ‘/opt/zbox/tmp/mysq
运维·docker·容器
泯泷19 小时前
编写 Dockerfile:从入门到精通
后端·docker·容器
方渐鸿1 天前
【2025】使用docker compose一键部署项目到服务器(4)
java·docker·运维开发·持续部署
HalukiSan1 天前
Docker_Desktop开启k8s
docker·容器
毒爪的小新1 天前
Docker基础命令
linux·运维·docker·容器·centos