QGIS的docker管理
This commit is contained in:
+85
-9
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user