我的小服务器内存告急,但是最近固态硬盘价格疯涨,只能想办法优化一下空间了,记录一下我的docker镜像大小优化,废话不多说直接看成果。

直接从3.74G搞到67m,其实是我太不注意啦,其实代码还真不太多,都是依赖太占空间了。

检查Dockerfile

原 Dockerfile 使用 `python:3.9-slim` 作为基础镜像,并安装了 curl、cron、supervisor 等不需要的组件,启动也使用了较重的 supervisor。镜像体积约 1.2GB。

# 使用官方的 Python 镜像作为基础镜像
FROM python:3.9-slim

# 设置工作目录
WORKDIR /app

RUN apt-get update && apt-get install -y \
    curl \
    cron \
    tzdata \
    supervisor \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# 设置时区为中国
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

# 将 requirements.txt 文件复制到工作目录
COPY requirements.txt .

# 安装依赖包
RUN pip install --no-cache-dir -r requirements.txt

COPY . .

# 创建配置目录
RUN mkdir /config

# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_ENV=production
ENV CONFIG_PATH=/config

# 暴露 Flask 默认运行端口
EXPOSE 5000

# 复制 supervisord 配置文件
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf

# 使用 supervisord 启动
CMD ["/usr/bin/supervisord"]

优化方案



### 基础镜像
- `python:3.9-slim` → `python:3.9-alpine`
- slim 约 900MB+,alpine 约 50MB

### 移除不需要的包
- curl:不需要
- cron:不需要(Python schedule 库已满足定时任务需求)
- supervisor:过重,gunicorn 可直接管理多进程

### 启动方式
- 原:`supervisord` 启动 Flask + cron
- 优化后:`gunicorn` 直接启动 Flask

### Dockerfile 层缓存优化
- 先 COPY requirements.txt,安装依赖
- 再 COPY 应用代码
- 改代码时不重新安装依赖

## 优化后效果

镜像体积:~3.74.GB → ~70MB

## 故障排查

### 构建时报错 `externally-managed-environment`

如果遇到以下错误:
```
ERROR: externally managed environment
```

解决方案:确保 Dockerfile 中包含 `--break-system-packages` 参数:
```dockerfile
RUN pip install --no-cache-dir --break-system-packages -r requirements.txt
```

### 容器无法启动

1. 检查日志:
```bash
docker logs <容器名>
```

2. 常见问题:
   - 端口冲突:修改 gunicorn 端口或映射配置
   - 配置目录权限:确保 /config 目录存在且有写入权限
   - 时区问题:alpine 镜像已配置 TZ=Asia/Shanghai

### 验证启动

```bash
# 查看容器运行状态
docker ps

# 查看日志
docker logs -f <容器名>

# 测试接口
curl http://localhost:5000
```

## 相关文件

- Dockerfile
- requirements.txt