提交 2b4cdefe authored 作者: 陈泽健's avatar 陈泽健

fix(deploy): 解决Java容器端口映射解析错误

- 将端口映射数组改为动态构建方式,避免参数解析问题
- 分离-p选项与端口值,防止数组展开时的格式错误
- 添加端口映射列表便于维护和扩展
- 为部署脚本添加语法检查配置
- 创建问题处理文档记录错误原因和解决方案
- 编写计划执行文档确保修复方案正确实施
上级 d78ff1f1
...@@ -132,7 +132,8 @@ ...@@ -132,7 +132,8 @@
"Bash(check_deleted_file_ubains_header.tmp:*)", "Bash(check_deleted_file_ubains_header.tmp:*)",
"Bash(mv check_deleted_file_ubains_header.tmp check_deleted_file_ubains.sh)", "Bash(mv check_deleted_file_ubains_header.tmp check_deleted_file_ubains.sh)",
"Bash(chmod +x check_deleted_file_ubains.sh)", "Bash(chmod +x check_deleted_file_ubains.sh)",
"Bash(bash -n \"E:\\\\ubains-module-test\\\\ubains-module-test\\\\自动化部署脚本\\\\x86架构\\\\预定系统\\\\一键更新\\\\update_cron_jobs.sh\")" "Bash(bash -n \"E:\\\\ubains-module-test\\\\ubains-module-test\\\\自动化部署脚本\\\\x86架构\\\\预定系统\\\\一键更新\\\\update_cron_jobs.sh\")",
"Bash(bash -n auto_deploy_services.sh)"
] ]
} }
} }
# 问题描述
## 脚本:`自动化部署脚本/x86架构/新统一平台/auto_deploy_services.sh`
## 问题现象
- 在执行代码后打印了`docker: invalid hostPort: 8085`
# 报错日志信息
```ignorelang
Loaded image: 139.9.60.86:5000/ujava:v6
[2026-04-07 10:10:28] [INFO] 🎉 镜像加载成功
[2026-04-07 10:10:28] [INFO] 🚀 正在启动 Java 容器: ujava2 ...
docker: invalid hostPort: 8085
Run 'docker run --help' for more information
```
\ No newline at end of file
# Java容器部署失败问题 - 计划执行文档
## 问题描述
- **脚本**: `自动化部署脚本/x86架构/新统一平台/auto_deploy_services.sh`
- **错误**: `docker: invalid hostPort: 8085`
- **位置**: `java_x86()` 函数的端口映射配置
## 问题原因分析
1. **数组定义格式问题**: `port_args` 数组使用 `"-p 8085:8085"` 格式,将选项和值放在同一个数组元素中
2. **展开时的潜在问题**: 当数组元素包含空格时(如 `-p 8085:8085`),在某些bash展开场景下可能导致参数解析异常
3. **错误特征**: 端口前有两个空格,说明格式解析出现问题
## 修复方案
### 方案选择
- **推荐方案**: 修改数组定义格式,将每个 `-p` 和端口映射分离为独立元素
- **备选方案**: 直接内联端口参数(参考其他函数的实现方式)
### 代码修改
**修改前** (第32-44行):
```bash
local port_args=(
"-p 8085:8085"
"-p 8993:8993" "-p 8994:8994" "-p 8995:8995"
"-p 8999:8999"
"-p 8719:8719" "-p 8720:8720"
"-p 9204:9204" "-p 9200:9200" "-p 9201:9201" "-p 9903:9903"
"-p 9904:9904" "-p 9905:9905" "-p 9906:9906" "-p 9907:9907"
"-p 9908:9908" "-p 9909:9909" "-p 9910:9910" "-p 9911:9911"
"-p 9912:9912" "-p 9913:9913" "-p 9914:9914" "-p 9915:9915"
"-p 9916:9916" "-p 9917:9917" "-p 9918:9918" "-p 9919:9919"
"-p 9920:9920" "-p 30880:30880" "-p 30881:30881" "-p 30882:30882"
"-p 30883:30883" "-p 30884:30884"
)
```
**修改后**:
```bash
# 端口映射列表(每个端口映射一行,-p与端口分离)
local port_mappings=(
8085
8993 8994 8995 8999
8719 8720
9204 9200 9201 9903 9904 9905 9906 9907 9908 9909 9910 9911
9912 9913 9914 9915 9916 9917 9918 9919 9920
30880 30881 30882 30883 30884
)
# 构建端口参数数组
local port_args=()
for port in ${port_mappings[@]}; do
port_args+=("-p" "$port:$port")
done
```
**Docker命令修改** (第78-87行):
保持不变,继续使用 `"${port_args[@]}"`
## 实施步骤
- [x] 1. 修改 `port_args` 数组定义方式
- [x] 2. 添加循环构建端口参数的逻辑
- [x] 3. 验证语法正确性
- [ ] 4. 添加调试日志(可选,用于验证参数展开)
- [ ] 5. 更新文档说明
## 测试验证
1. **静态检查**: ✅ 已通过语法验证
2. **参数验证**: ⏳ 待测试环境验证
3. **实际部署**: ⏳ 待测试环境执行
## 相关文件
- `自动化部署脚本/x86架构/新统一平台/auto_deploy_services.sh` (第32-44行, 第78-87行)
## 优化回填
- [ ] 考虑统一所有函数的端口参数定义方式
- [ ] 添加端口参数配置化支持(从配置文件读取)
...@@ -28,21 +28,22 @@ function java_x86() ...@@ -28,21 +28,22 @@ function java_x86()
"-v $host_fdfs_data:/var/fdfs/storage/data" "-v $host_fdfs_data:/var/fdfs/storage/data"
) )
# 端口映射(可根据需要增减) # 端口映射列表(每个端口映射,便于维护和扩展)
local port_args=( local port_mappings=(
"-p 8085:8085" 8085
"-p 8993:8993" "-p 8994:8994" "-p 8995:8995" 8993 8994 8995 8999
"-p 8999:8999" 8719 8720
"-p 8719:8719" "-p 8720:8720" 9204 9200 9201 9903 9904 9905 9906 9907 9908 9909 9910 9911
"-p 9204:9204" "-p 9200:9200" "-p 9201:9201" "-p 9903:9903" 9912 9913 9914 9915 9916 9917 9918 9919 9920
"-p 9904:9904" "-p 9905:9905" "-p 9906:9906" "-p 9907:9907" 30880 30881 30882 30883 30884
"-p 9908:9908" "-p 9909:9909" "-p 9910:9910" "-p 9911:9911"
"-p 9912:9912" "-p 9913:9913" "-p 9914:9914" "-p 9915:9915"
"-p 9916:9916" "-p 9917:9917" "-p 9918:9918" "-p 9919:9919"
"-p 9920:9920" "-p 30880:30880" "-p 30881:30881" "-p 30882:30882"
"-p 30883:30883" "-p 30884:30884"
) )
# 构建端口参数数组(将 -p 选项与端口值分离,避免解析问题)
local port_args=()
for port in "${port_mappings[@]}"; do
port_args+=("-p" "$port:$port")
done
# ------------------- 检查容器是否已运行 ------------------- # ------------------- 检查容器是否已运行 -------------------
log "INFO" "🔍 检查 Java 容器是否已运行..." log "INFO" "🔍 检查 Java 容器是否已运行..."
if $sudoset docker ps --format '{{.Names}}' | grep -wq "^$container_name$"; then if $sudoset docker ps --format '{{.Names}}' | grep -wq "^$container_name$"; then
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论