FROM python:3.11-slim ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PIP_NO_CACHE_DIR=1 \ PIP_DISABLE_PIP_VERSION_CHECK=1 # 系统依赖:curl 用于健康检查,default-mysql-client 提供 mysqldump,tar 已内置,influx CLI 用于 InfluxDB 备份 RUN apt-get update && apt-get install -y --no-install-recommends \ curl \ default-mysql-client \ tar \ gzip \ tzdata \ ca-certificates \ gnupg \ && rm -rf /var/lib/apt/lists/* # 安装 InfluxDB CLI(直接下载二进制,避免 apt 签名问题) RUN set -eux; \ INFLUX_VERSION=2.7.5; \ curl -fsSL "https://dl.influxdata.com/influxdb/releases/influxdb2-client-${INFLUX_VERSION}-linux-amd64.tar.gz" \ -o /tmp/influx.tar.gz; \ tar -xzf /tmp/influx.tar.gz -C /tmp; \ mv /tmp/influx /usr/local/bin/influx; \ chmod +x /usr/local/bin/influx; \ rm -rf /tmp/influx.tar.gz /tmp/influx; \ influx version # 安装 etcdctl(直接下载二进制) RUN set -eux; \ ETCD_VERSION=v3.5.17; \ curl -fsSL "https://github.com/etcd-io/etcd/releases/download/${ETCD_VERSION}/etcd-${ETCD_VERSION}-linux-amd64.tar.gz" \ -o /tmp/etcd.tar.gz; \ tar -xzf /tmp/etcd.tar.gz -C /tmp; \ mv /tmp/etcd-${ETCD_VERSION}-linux-amd64/etcdctl /usr/local/bin/etcdctl; \ chmod +x /usr/local/bin/etcdctl; \ rm -rf /tmp/etcd.tar.gz /tmp/etcd-${ETCD_VERSION}-linux-amd64; \ etcdctl version WORKDIR /app # 先安装依赖以利用 Docker 缓存 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . # 数据、日志、备份目录 RUN mkdir -p /app/data/backups /app/logs EXPOSE 8000 # alembic 升级 + 启动 uvicorn CMD ["sh", "-c", "alembic upgrade head && uvicorn app.main:app --host 0.0.0.0 --port 8000"]