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.pswp.cn/bicheng/83533.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83533.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83533.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

webstrom中git插件勾選提交部分文件時卻出現提交全部問題怎么解決

原因是我有個.husky的文件制定了執行提交的時候就是提交所有的文件 修改.husky/pre-commit文件就可以啦 #!/usr/bin/env sh . "$(dirname -- "$0")/_/husky.sh"# 獲取通過 WebStorm 提交的暫存文件(僅勾選的部分) STAGED_FILES$(gi…

OSG編譯wasm嘗試

最近遇到一個情況,需要嘗試一下OSG到webassembly 發現官網有教程 于是順著看了看,默認教程是xubuntu的一個系統跑的,但是我本著試一試的想法,拉下來直接在windows上跑,奇奇怪怪的報錯簡直頭皮發麻 然后怎么辦呢&#x…

QT中子線程觸發主線程彈窗并阻塞等待用戶響應-傳統信號槽實現

目錄 QT中子線程觸發主線程彈窗并阻塞等待用戶響應傳統信號槽實現實現思路具體步驟1. 定義信號與槽2. 異步任務中觸發彈窗3. 主線程處理彈窗4. 連接信號與槽關鍵點總結 更簡單實現 QT中子線程觸發主線程彈窗并阻塞等待用戶響應 傳統信號槽實現 場景需求:在子線程執…

STM32學習之WWDG(原理+實操)

📢:如果你也對機器人、人工智能感興趣,看來我們志同道合? 📢:不妨瀏覽一下我的博客主頁【https://blog.csdn.net/weixin_51244852】 📢:文章若有幸對你有幫助,可點贊 👍…

【端午安康】龍舟爭渡Plug-In

文章目錄 正文附錄A:關于Python的錄屏方法總結(來自DeepSeek的回答)1. 使用 pyautogui 和 OpenCV 錄制屏幕2. 使用 mss 庫(高效屏幕捕獲)3. 使用 PIL.ImageGrab 錄制屏幕4. 使用 Windows 原生快捷鍵錄制(非…

Apache SeaTunnel部署技術詳解:模式選擇、技巧與最佳實踐

Apache SeaTunnel(原Waterdrop)作為高性能、分布式數據集成平臺,支持海量數據的離線與實時同步。其靈活多樣的部署模式可適配不同規模的生產環境需求。本文將系統解析SeaTunnel的部署架構、技術要點及最佳實踐,幫助用戶高效構建穩定可靠的數據管道。 一、部署模式全景概覽 …

【機械視覺】Halcon—【六、交集并集差集和仿射變換】

【機械視覺】Halcon—【六、交集并集差集和仿射變換】 目錄 【機械視覺】Halcon—【六、交集并集差集和仿射變換】 介紹 交集并集差集介紹: 1. 交集(Intersection) 2. 并集(Union) 3. 差集(Difference&#xff…

實驗設計與分析(第6版,Montgomery)第5章析因設計引導5.7節思考題5.6 R語言解題

本文是實驗設計與分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅玨生譯) 第5章析因設計引導5.7節思考題5.6 R語言解題。主要涉及方差分析&#xff0c;正態假設檢驗&#xff0c;殘差分析&#xff0c;交互作用圖&#xff0c;等值線圖。 dataframe <-data.frame…

劍指offer15_數值的整數次方

數值的整數次方 實現函數 double Power(double base, int exponent) 題目要求 計算 base exponent \text{base}^{\text{exponent}} baseexponent&#xff1a; 不得使用庫函數不需要考慮大數問題&#xff0c;絕對誤差不超過 10 ? 2 10^{-2} 10?2不會出現底數和指數同為 0…

【Typst】1.Typst概述

概述 Typst是一種用于排版文檔的標記語言&#xff0c;可以用于排版各種精美的論文、文章、書籍、報告和作業等。它是LaTex的精神續作&#xff0c;但是運行環境和編譯速度都要更簡單、更快捷。 它設計了一種腳本結合簡單的標記語法實現復雜的排版效果。并且支持模板創建、文件…

[Java惡補day14] 56. 合并區間

以數組 intervals 表示若干個區間的集合&#xff0c;其中單個區間為 intervals[i] [starti, endi] 。請你合并所有重疊的區間&#xff0c;并返回 一個不重疊的區間數組&#xff0c;該數組需恰好覆蓋輸入中的所有區間 。 示例 1&#xff1a; 輸入&#xff1a;intervals [[1,3…

DiskGenius專業版v6.0.1.1645:分區管理、數據恢復、備份還原,一應俱全!

各位小伙伴&#xff0c;大家好&#xff01;今天阿燦給大家帶來一款超好用的分區工具&#xff0c;DiskGenius專業版。這款工具堪稱電腦管理界的“瑞士軍刀”&#xff0c;功能強大&#xff0c;現在出了新版本v6.0.1.1645&#xff0c;簡繁中文單文件便攜版&#xff0c;使用超方便。…

azure web app創建分步指南系列之二

為注冊表授權托管標識 你創建的托管標識尚未獲得從容器注冊表中提取數據的授權。在此步驟中,你將啟用授權。 返回容器注冊表的管理頁面: 在左側導航菜單中,選擇“訪問控制 (IAM)”。選擇“添加角色分配”。此屏幕截圖顯示了如何為容器注冊表啟用添加角色分配。在角色列表中…

STM32 AD單通道與多通道實戰指南

文章目錄 AD單通道&#xff08;實驗&#xff09;有關配置的庫函數AD單通道部分主要代碼 AD多通道實現多通道采集實現思路探討單次轉換非掃描模式實現AD多通道AD多通道部分代碼 學習建議&#xff1a;推薦搭配 江協科技 AD單通道 AD多通道一起食用&#xff01;&#xff01;&#…

溝通頻率不合適,如何找到平衡點

在團隊協作中&#xff0c;溝通頻率過高、信息干擾、節奏錯位常常導致效率下降與成員倦怠。PMI研究指出&#xff0c;溝通不當是75%項目延誤的根源&#xff0c;其中溝通頻率失衡是關鍵變量之一。要解決這一問題&#xff0c;關鍵在于設定節奏、分層溝通、制定協議。其中&#xff0…

EC2 實例詳解:AWS 的云服務器怎么玩???

彈性計算、靈活計費、全球可用&#xff0c;AWS EC2 全攻略 在 AWS 生態中&#xff0c;有兩個核心服務是非常關鍵的&#xff0c;一個是 S3&#xff08;對象存儲&#xff09;&#xff0c;另一個就是我們今天的主角 —— Amazon EC2&#xff08;Elastic Compute Cloud&#xff09…

lvs-keepalived高可用群集

目錄 1.Keepalived 概述及安裝 1.1 Keepalived 的熱備方式 1.2 keepalived的安裝與服務控制 &#xff08;1&#xff09;安裝keep alived (2)控制 Keepalived 服務DNF 安裝 keepalived 后,執行以下命令將keepalived 服務設置為開機啟動。 2.使用 Keepalived 實現雙機熱備 …

車載診斷架構SOVD --- 車輛發現與建連

我是穿拖鞋的漢子,魔都中堅持長期主義的汽車電子工程師。 老規矩,分享一段喜歡的文字,避免自己成為高知識低文化的工程師: 鈍感力的“鈍”,不是木訥、遲鈍,而是直面困境的韌勁和耐力,是面對外界噪音的通透淡然。 生活中有兩種人,一種人格外在意別人的眼光;另一種人無論…

BUUCTF之[ACTF2020 新生賽]BackupFile

打開環境就一句話 找出源文件! 結合題目名字&#xff1a;BackupFile 先用dirsearct掃描網站文件 發現一個index.php.bak ,拼接url下載 打開發現php代碼 <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key];if(!is_numeric($key)) {exit…

Rag技術----項目博客(六)

RAG 定義&#xff1a;檢索增強生成&#xff08;Retrieval Augmented Generation&#xff09;&#xff0c;簡稱 RAG&#xff0c;已經成為當前最火熱的LLM應用方案。 目的&#xff1a;通過提供相關領域數據庫通過問題檢索信息&#xff0c;將相關信息合并到Prompt中&#xff0c;…