錯誤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: