docker 镜像大小优化
我的小服务器内存告急,但是最近固态硬盘价格疯涨,只能想办法优化一下空间了,记录一下我的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
评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果