From 012b0bbde3685734999401ce4b25ec1e421d5061 Mon Sep 17 00:00:00 2001 From: aaron <> Date: Fri, 21 Mar 2025 21:59:44 +0800 Subject: [PATCH] update --- Dockerfile | 36 +++++++++++++++++++++++++++++------- docker-compose.yml | 37 +++++++++++++++++++++++++++++++------ entrypoint.sh | 42 +++++++++++++++++++++++++++++++++++++----- 3 files changed, 97 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index 3217869..e6439ab 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,9 @@ # 使用Python 3.10作为基础镜像 FROM python:3.10-slim +# 设置环境变量 +ENV PYTHONUNBUFFERED=1 +ENV PYTHONDONTWRITEBYTECODE=1 # 设置时区 RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime @@ -27,25 +30,44 @@ RUN apt-get update \ default-libmysqlclient-dev \ pkg-config \ curl \ + nano \ && rm -rf /var/lib/apt/lists/* # 设置工作目录 WORKDIR /app -# 复制项目文件 +# 安装Python依赖(先于文件复制,利用缓存) COPY requirements.txt . +RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt \ + && pip install -i https://mirrors.aliyun.com/pypi/simple/ uvicorn python-multipart python-dotenv + +# 复制项目文件 COPY app app/ COPY *.py ./ -COPY .env* ./ COPY entrypoint.sh . +# 创建一个默认的.env.example文件 +RUN echo "# 数据库配置\n\ +DB_HOST=db\n\ +DB_PORT=3306\n\ +DB_USER=ai_user\n\ +DB_PASSWORD=yourpassword\n\ +DB_NAME=ai_dressing\n\ +\n\ +# 阿里云DashScope配置\n\ +DASHSCOPE_API_KEY=your_dashscope_api_key\n\ +\n\ +# 腾讯云配置\n\ +QCLOUD_SECRET_ID=your_qcloud_secret_id\n\ +QCLOUD_SECRET_KEY=your_qcloud_secret_key\n\ +QCLOUD_COS_REGION=ap-chengdu\n\ +QCLOUD_COS_BUCKET=your-bucket-name\n\ +QCLOUD_COS_DOMAIN=https://your-bucket-domain.com\n\ +" > /app/.env.example + # 确保entrypoint.sh可执行 RUN chmod +x /app/entrypoint.sh -# 安装Python依赖 -RUN pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt \ - && pip install -i https://mirrors.aliyun.com/pypi/simple/ uvicorn python-multipart python-dotenv - # 暴露端口 EXPOSE 8000 @@ -53,4 +75,4 @@ EXPOSE 8000 ENTRYPOINT ["/app/entrypoint.sh"] # 启动命令 -CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"] \ No newline at end of file +CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--log-level", "info"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index a52d327..d9d1dfe 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -2,11 +2,18 @@ version: '3.8' services: app: - build: . + build: + context: . + args: + - DB_HOST=db + - DB_PORT=3306 + - DB_USER=ai_user + - DB_PASSWORD=yourpassword + - DB_NAME=ai_dressing container_name: ai-dressing-app restart: always ports: - - "9001:9001" + - "9001:8000" env_file: - ./.env # 环境变量可以覆盖.env文件中的值 @@ -16,15 +23,27 @@ services: - DB_USER=ai_user - DB_PASSWORD=yourpassword - DB_NAME=ai_dressing - - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY} - - QCLOUD_SECRET_ID=${QCLOUD_SECRET_ID} - - QCLOUD_SECRET_KEY=${QCLOUD_SECRET_KEY} + # 这些环境变量会从宿主机的环境变量中读取,如果不存在则使用示例值 + - DASHSCOPE_API_KEY=${DASHSCOPE_API_KEY:-your_dashscope_api_key} + - QCLOUD_SECRET_ID=${QCLOUD_SECRET_ID:-your_qcloud_secret_id} + - QCLOUD_SECRET_KEY=${QCLOUD_SECRET_KEY:-your_qcloud_secret_key} + - QCLOUD_COS_REGION=${QCLOUD_COS_REGION:-ap-chengdu} + - QCLOUD_COS_BUCKET=${QCLOUD_COS_BUCKET:-your-bucket-name} + - QCLOUD_COS_DOMAIN=${QCLOUD_COS_DOMAIN:-https://your-bucket-domain.com} + - PYTHONPATH=/app depends_on: - db volumes: - - ./:/app + - ./.env:/app/.env:ro # 明确映射.env文件 + # - ./app:/app/app # 开发时才使用,生产环境建议去掉 networks: - ai-dressing-network + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 10s db: image: mysql:8.0 @@ -43,6 +62,12 @@ services: command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci networks: - ai-dressing-network + healthcheck: + test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p$$MYSQL_ROOT_PASSWORD"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s volumes: mysql-data: diff --git a/entrypoint.sh b/entrypoint.sh index 0d8ba04..567dcff 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,20 +1,52 @@ #!/bin/bash set -e -# 检查.env文件是否存在 +echo "============= 容器启动 =============" +echo "当前工作目录: $(pwd)" +echo "目录内容:" +ls -la + +# 优先级1: 尝试从.env文件加载 if [ -f .env ]; then echo "找到.env文件,加载环境变量..." + # 打印文件内容(隐藏敏感信息) + echo "文件内容预览(敏感信息已隐藏):" + grep -v "KEY\|PASSWORD\|SECRET" .env | cat -n + # 从.env文件导出所有环境变量 export $(grep -v '^#' .env | xargs) + echo "已从.env加载环境变量" +elif [ -f /app/.env ]; then + echo "在/app目录下找到.env文件,加载环境变量..." + export $(grep -v '^#' /app/.env | xargs) + echo "已从/app/.env加载环境变量" +elif [ -f .env.docker ]; then + echo "找到.env.docker文件,加载环境变量..." + export $(grep -v '^#' .env.docker | xargs) + echo "已从.env.docker加载环境变量" else - echo ".env文件不存在,使用默认环境变量..." + echo ".env文件不存在,环境变量将从Docker环境中读取..." fi -# 打印重要环境变量,确认已加载(不打印敏感信息) -echo "环境变量检查:" +# 打印环境变量,确认是否已正确加载 +echo "============= 环境变量检查 =============" echo "DB_HOST: $DB_HOST" +echo "DB_PORT: $DB_PORT" +echo "DB_USER: $DB_USER" echo "DB_NAME: $DB_NAME" -echo "ENVIRONMENT: $ENVIRONMENT" +echo "DASHSCOPE_API_KEY是否存在: $(if [ -n "$DASHSCOPE_API_KEY" ]; then echo "是"; else echo "否"; fi)" +echo "QCLOUD_SECRET_ID是否存在: $(if [ -n "$QCLOUD_SECRET_ID" ]; then echo "是"; else echo "否"; fi)" + +# 确保Python能找到应用 +export PYTHONPATH=/app:$PYTHONPATH + +echo "============= Python环境 =============" +echo "Python版本: $(python --version)" +echo "Python路径: $(which python)" +echo "PYTHONPATH: $PYTHONPATH" + +echo "============= 启动应用 =============" +echo "执行命令: $@" # 执行原始的命令 exec "$@" \ No newline at end of file