Преглед изворни кода

fix: 修复因为.env残留文件导致的配置错误

天空之城 пре 3 недеља
родитељ
комит
ee2e551b8f
3 измењених фајлова са 50 додато и 6 уклоњено
  1. 31 0
      .dockerignore
  2. 12 3
      Jenkinsfile
  3. 7 3
      alien_gateway/config.py

+ 31 - 0
.dockerignore

@@ -0,0 +1,31 @@
+# 避免误打入容器的本地/敏感文件
+.env
+.env.local
+.env.*.local
+
+# Python 缓存
+__pycache__/
+*.pyc
+*.pyo
+*.pyd
+.pytest_cache/
+
+# 虚拟环境
+.venv/
+venv/
+
+# IDE / Git
+.git/
+.gitignore
+.idea/
+.vscode/
+
+# 日志和临时文件
+*.log
+common/logs/
+*.tmp
+
+# 镜像构建无需的文件
+README.md
+docs/
+tests/

+ 12 - 3
Jenkinsfile

@@ -85,32 +85,41 @@ pipeline {
             # 创建日志目录
             mkdir -p ${LOG_ROOT}/store ${LOG_ROOT}/gateway ${LOG_ROOT}/contract
 
+            # 把当前 workspace 的 .env.uat 复制到宿主机持久目录,供容器挂载使用
+            mkdir -p /docker/python-uat
+            cp .env.uat /docker/python-uat/.env.uat
+
             # 停止旧容器(不会误删 java 的 gateway-uat / store-uat / 真正的 esign-uat 等)
             docker rm -f ${CONTAINER_NAME_STORE} ${CONTAINER_NAME_GATEWAY} ${CONTAINER_NAME_CONTRACT} 2>/dev/null || true
 
             # 1) 先启动下游:store
-            #    只走 docker 内部网络,不向宿主机暴露端口(避免与 java gateway-uat 抢 8001)
             docker run -d --name ${CONTAINER_NAME_STORE} \\
               --network ${DOCKER_NET} \\
+              -e APP_ENV=uat \\
+              -v /docker/python-uat/.env.uat:/app/.env.uat:ro \\
               -v ${LOG_ROOT}/store:/app/common/logs/alien_store \\
               --restart unless-stopped \\
               ${IMAGE_STORE}
 
             # 2) 再启动下游:contract
-            #    只走 docker 内部网络,不向宿主机暴露端口
             docker run -d --name ${CONTAINER_NAME_CONTRACT} \\
               --network ${DOCKER_NET} \\
+              -e APP_ENV=uat \\
+              -v /docker/python-uat/.env.uat:/app/.env.uat:ro \\
               -v ${LOG_ROOT}/contract:/app/common/logs/alien_contract \\
               --restart unless-stopped \\
               ${IMAGE_CONTRACT}
 
             # 3) 最后启动网关:gateway(依赖上面两个下游;唯一对外暴露的入口)
+            #    STORE_BASE_URL / CONTRACT_BASE_URL 通过 -e 覆盖 .env.uat 中的本地默认值
             docker run -d --name ${CONTAINER_NAME_GATEWAY} \\
               --network ${DOCKER_NET} \\
               -p ${PORT_GATEWAY}:${PORT_GATEWAY} \\
-              -v ${LOG_ROOT}/gateway:/app/common/logs/alien_gateway \\
+              -e APP_ENV=uat \\
               -e STORE_BASE_URL=http://${CONTAINER_NAME_STORE}:${PORT_STORE} \\
               -e CONTRACT_BASE_URL=http://${CONTAINER_NAME_CONTRACT}:${PORT_CONTRACT} \\
+              -v /docker/python-uat/.env.uat:/app/.env.uat:ro \\
+              -v ${LOG_ROOT}/gateway:/app/common/logs/alien_gateway \\
               --restart unless-stopped \\
               ${IMAGE_GATEWAY}
           """

+ 7 - 3
alien_gateway/config.py

@@ -1,9 +1,12 @@
 from pydantic_settings import BaseSettings, SettingsConfigDict
 from typing import Any, Dict, List
-from dotenv import load_dotenv
 from urllib.parse import quote
 import os
-load_dotenv()
+
+# 通过环境变量 APP_ENV 选择 .env 文件,默认为 uat
+# - 本地开发:APP_ENV=dev  -> .env.dev
+# - 测试环境:APP_ENV=uat  -> .env.uat(默认)
+_ENV_FILE = f".env.{os.getenv('APP_ENV', 'uat')}"
 
 class Settings(BaseSettings):
     # 基础配置
@@ -111,7 +114,8 @@ class Settings(BaseSettings):
 
     model_config = SettingsConfigDict(
         case_sensitive=True,
-        env_file=".env.uat",
+        env_file=_ENV_FILE,
+        extra="ignore",
     )
 
 settings = Settings()