QGIS的docker管理

This commit is contained in:
wzy-warehouse
2026-06-22 11:01:15 +08:00
parent 154f0a968e
commit d402668a5c
5 changed files with 290 additions and 24 deletions
+85 -9
View File
@@ -66,7 +66,65 @@ docker run -d ^
| `-v 输出目录:输出目录` | 文件输出目录读写挂载,保持主机与容器路径一致 |
| `sleep infinity` | 保持容器运行,等待 `docker exec` 调用 |
## 4. 安装中文字体(手动
## 4. 预拷贝静态数据到容器本地 FS(必须,性能关键
WSL2 9P 文件系统随机读取极慢(GPKG 62MB 耗时 6-10s/模板,模板 ZIP 也慢),拷贝到容器内 `/data/` 后读取仅需 ~0.5s。
### 方式一:Python 脚本(推荐)
```bash
python app/script/copy_data_to_container.py
```
输出示例:
```
=== 预拷贝静态数据到容器 qgis-server ===
[GPKG] 主机目录: F:\project\xian\xian_algorithm_new\app\data\gpkg
文件数: 23, 总大小: 62.3 MB
容器目标: qgis-server:/data/gpkg
拷贝完成: 3.2s, 容器内 23 个文件
[模板] 主机目录: F:\project\xian\xian_algorithm_new\app\data\template
文件数: 34, 总大小: 45.1 MB
容器目标: qgis-server:/data/template
拷贝完成: 2.1s, 容器内 34 个文件
=== 总耗时: 5.4s ===
```
其他用法:
```bash
python app/script/copy_data_to_container.py --dry-run # 仅查看信息
python app/script/copy_data_to_container.py --only gpkg # 只拷贝 GPKG
python app/script/copy_data_to_container.py --only template # 只拷贝模板
```
### 方式二:手动 docker cp
```bash
# 清理旧文件
docker exec qgis-server rm -rf /data/gpkg /data/template
# 拷贝 GPKG
docker cp F:\project\xian\xian_algorithm_new\app\data\gpkg qgis-server:/data/gpkg
# 拷贝模板
docker cp F:\project\xian\xian_algorithm_new\app\data\template qgis-server:/data/template
# 验证
docker exec qgis-server ls -la /data/gpkg
docker exec qgis-server ls -la /data/template/rainfall
docker exec qgis-server ls -la /data/template/earthquake
```
### 何时需要重新执行
- GPKG 或模板文件有更新时
- 容器重建后(`/data` 目录丢失)
- 首次部署时
## 5. 安装中文字体(手动)
QGIS 模板使用了 SimHei(黑体)、SimSun(宋体)、Microsoft YaHei(微软雅黑)等 Windows 中文字体,
Docker 镜像默认不包含这些字体,会导致中文全部乱码。**字体需手动安装,代码不会自动安装。**
@@ -122,7 +180,7 @@ docker run -d ... \
...
```
## 5. 验证容器
## 6. 验证容器
```bash
# 检查容器状态
@@ -135,7 +193,7 @@ docker exec qgis-server python3 -c "from qgis.core import QgsApplication; print(
docker exec qgis-server ls /app/app/services/qgis/
```
## 6. 配置文件
## 7. 配置文件
所有 Docker 相关配置集中在 `settings.toml``[default]` 段:
@@ -158,6 +216,8 @@ QGIS_DOCKER_KEEP_ALIVE = "sleep infinity" # 容器保活命令
# ---- 专题图参数 ----
QGIS_GPKG_DIR = "app/data/gpkg" # GPKG 目录(相对于项目根)
QGIS_DOCKER_GPKG_DIR = "/data/gpkg" # 容器内 GPKG 本地路径(预拷贝后读取)
QGIS_DOCKER_TEMPLATE_DIR = "/data/template" # 容器内模板本地路径(预拷贝后读取)
QGIS_EXPORT_DPI = 200 # 导出 DPI
QGIS_PARALLEL_WORKERS = 4 # 并行 docker exec 子进程数
QGIS_MAX_CONCURRENT = 2 # 最大并发请求数
@@ -184,7 +244,7 @@ export QGIS_DOCKER_PYTHON="/usr/bin/python3"
| `DB_HOST` | `"47.92.216.173"` | `"10.22.245.138"` |
| `DB_PORT` | `7654` | `54321` |
## 7. 目录结构
## 8. 目录结构
```
项目根目录/
@@ -200,6 +260,8 @@ export QGIS_DOCKER_PYTHON="/usr/bin/python3"
│ │ └── map_exporter.py # 图片导出
│ └── api/
│ └── qgis_map_export.py # FastAPI 专题图导出接口
├── script/
│ └── copy_data_to_container.py # GPKG + 模板预拷贝脚本
├── config.py # Dynaconf 配置入口
├── settings.toml # 全部配置
├── requirements.txt # Python 依赖
@@ -207,12 +269,12 @@ export QGIS_DOCKER_PYTHON="/usr/bin/python3"
└── tmp/ # 临时文件目录(容器内映射为 /app/tmp/)
```
## 8. 临时文件
## 9. 临时文件
- 主机端临时 JSON(批量产图配置):写入 `{项目根}/tmp/`,容器内可通过 `/app/tmp/` 访问
- 容器端临时 .qgz(修改后的模板):写入容器内 `/tmp/`,由 runner 自动清理
## 9. 故障排查
## 10. 故障排查
```bash
# 容器未运行
@@ -242,14 +304,28 @@ zh = [f for f in db.families() if any(k in f for k in ['SimHei','YaHei','SimSun'
print('中文字体:', zh if zh else '未安装!')
"
# 检查 GPKG 文件
docker exec qgis-server ls /app/app/data/gpkg/
# 检查 GPKG 文件(容器本地路径,性能关键)
docker exec qgis-server ls /app/app/data/gpkg/ # 挂载路径(慢)
docker exec qgis-server ls /data/gpkg/ # 本地路径(快,需预拷贝)
# 检查模板文件(容器本地路径)
docker exec qgis-server ls /data/template/rainfall/ # 本地路径(快)
docker exec qgis-server ls /data/template/earthquake/
# 检查临时文件目录
docker exec qgis-server ls /app/tmp/
```
## 10. 工作流程
### 静态数据相关问题
| 问题 | 原因 | 解决 |
|------|------|------|
| 产图慢(>60s) | GPKG/模板从挂载目录读取(9P 慢) | 执行 `python app/script/copy_data_to_container.py` |
| 日志显示 `gpkg_dir=/app/...` | 未预拷贝或 `QGIS_DOCKER_GPKG_DIR` 为空 | 检查 settings.toml 配置 |
| 容器重建后变慢 | `/data` 目录丢失 | 重新执行拷贝脚本 |
| `docker cp` 权限错误 | 容器未运行 | `docker start qgis-server` |
## 11. 工作流程
```
用户请求 POST /qgis/export/map