This commit is contained in:
aaron 2025-03-21 21:59:44 +08:00
parent 3d837597ba
commit 012b0bbde3
3 changed files with 97 additions and 18 deletions

View File

@ -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"]
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--log-level", "info"]

View File

@ -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:

View File

@ -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 "$@"