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

refactor(deploy): 重构自动化部署脚本的参数构建逻辑

- 将端口映射参数从单元素格式改为分离格式,避免解析问题
- 将卷挂载参数从单元素格式改为分离格式,解决路径前空格问题
- 添加循环构建参数数组的逻辑,提高参数传递准确性
- 更新问题处理文档,记录新的错误现象和解决方案
- 优化数组遍历语法,使用双引号保护变量展开
上级 2b4cdefe
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
## 脚本:`自动化部署脚本/x86架构/新统一平台/auto_deploy_services.sh` ## 脚本:`自动化部署脚本/x86架构/新统一平台/auto_deploy_services.sh`
## 问题现象 ## 问题现象
- 在执行代码后打印了`docker: invalid hostPort: 8085` - 在执行代码后打印了`docker: invalid hostPort: 8085`
- 新脚本执行代码后报错:`docker: Error response from daemon: create /etc/localtime: " /etc/localtime" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute pathRun 'docker run --help' for more information`
# 报错日志信息 # 报错日志信息
```ignorelang ```ignorelang
Loaded image: 139.9.60.86:5000/ujava:v6 Loaded image: 139.9.60.86:5000/ujava:v6
...@@ -11,4 +12,14 @@ docker: invalid hostPort: 8085 ...@@ -11,4 +12,14 @@ docker: invalid hostPort: 8085
Run 'docker run --help' for more information Run 'docker run --help' for more information
```
```ignorelang
[2026-04-07 11:19:49] [INFO] 🚀 正在启动 Java 容器: ujava2 ...
docker: Error response from daemon: create /etc/localtime: " /etc/localtime" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path
Run 'docker run --help' for more information
[2026-04-07 11:20:07] [ERROR] ⛔ 容器启动失败
[2026-04-07 11:20:07] [ERROR] ❌ 函数执行失败: java_x86
[2026-04-07 11:20:07] [ERROR] ❌ 预定系统 部署失败
``` ```
\ No newline at end of file
...@@ -2,43 +2,37 @@ ...@@ -2,43 +2,37 @@
## 问题描述 ## 问题描述
- **脚本**: `自动化部署脚本/x86架构/新统一平台/auto_deploy_services.sh` - **脚本**: `自动化部署脚本/x86架构/新统一平台/auto_deploy_services.sh`
- **错误**: `docker: invalid hostPort: 8085` - **错误1**: `docker: invalid hostPort: 8085`
- **位置**: `java_x86()` 函数的端口映射配置 - **错误2**: `docker: Error response from daemon: create /etc/localtime: " /etc/localtime" includes invalid characters for a local volume name`
- **位置**: `java_x86()` 函数的端口映射和卷挂载配置
## 问题原因分析 ## 问题原因分析
### 问题1: 端口映射错误
1. **数组定义格式问题**: `port_args` 数组使用 `"-p 8085:8085"` 格式,将选项和值放在同一个数组元素中 1. **数组定义格式问题**: `port_args` 数组使用 `"-p 8085:8085"` 格式,将选项和值放在同一个数组元素中
2. **展开时的潜在问题**: 当数组元素包含空格时(如 `-p 8085:8085`),在某些bash展开场景下可能导致参数解析异常 2. **展开时的潜在问题**: 当数组元素包含空格时(如 `-p 8085:8085`),在某些bash展开场景下可能导致参数解析异常
3. **错误特征**: 端口前有两个空格,说明格式解析出现问题 3. **错误特征**: 端口前有两个空格,说明格式解析出现问题
## 修复方案 ### 问题2: 卷挂载错误 (新增)
1. **数组定义格式问题**: `volume_args` 数组使用 `"-v $host_api:/var/www/java/api"` 格式
### 方案选择 2. **变量展开问题**: 当 `-v` 和路径在同一个元素时,变量可能无法正确展开或路径前出现额外空格
- **推荐方案**: 修改数组定义格式,将每个 `-p` 和端口映射分离为独立元素 3. **错误特征**: 路径前有额外空格,导致 Docker 认为是无效的卷名称
- **备选方案**: 直接内联端口参数(参考其他函数的实现方式)
### 代码修改 ## 修复方案
### 修复1: 端口映射配置
**修改前** (第32-44行): **修改前** (第32-44行):
```bash ```bash
local port_args=( local port_args=(
"-p 8085:8085" "-p 8085:8085"
"-p 8993:8993" "-p 8994:8994" "-p 8995:8995" "-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 ```bash
# 端口映射列表(每个端口映射一行,-p与端口分离 # 端口映射列表(每个端口映射,便于维护和扩展
local port_mappings=( local port_mappings=(
8085 8085
8993 8994 8995 8999 8993 8994 8995 8999
...@@ -48,33 +42,63 @@ local port_mappings=( ...@@ -48,33 +42,63 @@ local port_mappings=(
30880 30881 30882 30883 30884 30880 30881 30882 30883 30884
) )
# 构建端口参数数组 # 构建端口参数数组(将 -p 选项与端口值分离,避免解析问题)
local port_args=() local port_args=()
for port in ${port_mappings[@]}; do for port in "${port_mappings[@]}"; do
port_args+=("-p" "$port:$port") port_args+=("-p" "$port:$port")
done done
``` ```
**Docker命令修改** (第78-87行): ### 修复2: 卷挂载配置 (新增)
保持不变,继续使用 `"${port_args[@]}"` **修改前** (第23-29行):
```bash
local volume_args=(
"-v $host_api:/var/www/java/api"
"-v $host_web:/var/www/java/web"
"-v $host_nginx_log:/usr/local/nginx/logs"
"-v /etc/localtime:/etc/localtime:ro"
"-v $host_fdfs_data:/var/fdfs/storage/data"
)
```
**修改后**:
```bash
# 卷挂载路径列表(便于维护)
local volume_mappings=(
"$host_api:/var/www/java/api"
"$host_web:/var/www/java/web"
"$host_nginx_log:/usr/local/nginx/logs"
"/etc/localtime:/etc/localtime:ro"
"$host_fdfs_data:/var/fdfs/storage/data"
)
# 构建卷参数数组(将 -v 选项与路径值分离,避免解析问题)
local volume_args=()
for mapping in "${volume_mappings[@]}"; do
volume_args+=("-v" "$mapping")
done
```
## 实施步骤 ## 实施步骤
- [x] 1. 修改 `port_args` 数组定义方式 - [x] 1. 修改 `port_args` 数组定义方式
- [x] 2. 添加循环构建端口参数的逻辑 - [x] 2. 添加循环构建端口参数的逻辑
- [x] 3. 验证语法正确性 - [x] 3. 验证语法正确性
- [ ] 4. 添加调试日志(可选,用于验证参数展开) - [x] 4. 修改 `volume_args` 数组定义方式
- [ ] 5. 更新文档说明 - [x] 5. 添加循环构建卷参数的逻辑
- [x] 6. 验证整体语法正确性
- [ ] 7. 添加调试日志(可选,用于验证参数展开)
## 测试验证 ## 测试验证
1. **静态检查**: ✅ 已通过语法验证 1. **静态检查**: ✅ 已通过语法验证 (全部)
2. **参数验证**: ⏳ 待测试环境验证 2. **参数验证**: ⏳ 待测试环境验证
3. **实际部署**: ⏳ 待测试环境执行 3. **实际部署**: ⏳ 待测试环境执行
## 相关文件 ## 相关文件
- `自动化部署脚本/x86架构/新统一平台/auto_deploy_services.sh` (第32-44行, 第78-87行) - `自动化部署脚本/x86架构/新统一平台/auto_deploy_services.sh` (第23-29行, 第31-45行, 第78-87行)
## 优化回填 ## 优化回填
- [ ] 考虑统一所有函数的端口参数定义方式 - [ ] 考虑统一所有函数的端口参数定义方式
- [ ] 添加端口参数配置化支持(从配置文件读取) - [ ] 添加端口参数配置化支持(从配置文件读取)
- [ ] 统一所有函数的卷挂载参数定义方式
...@@ -19,15 +19,21 @@ function java_x86() ...@@ -19,15 +19,21 @@ function java_x86()
local host_fdfs_data="/data/storage/storage/data" local host_fdfs_data="/data/storage/storage/data"
# 定义挂载映射 # 定义挂载映射
# 1. 定义卷挂载映射 (-v) # 1. 定义卷挂载路径列表(便于维护)
local volume_args=( local volume_mappings=(
"-v $host_api:/var/www/java/api" "$host_api:/var/www/java/api"
"-v $host_web:/var/www/java/web" "$host_web:/var/www/java/web"
"-v $host_nginx_log:/usr/local/nginx/logs" "$host_nginx_log:/usr/local/nginx/logs"
"-v /etc/localtime:/etc/localtime:ro" "/etc/localtime:/etc/localtime:ro"
"-v $host_fdfs_data:/var/fdfs/storage/data" "$host_fdfs_data:/var/fdfs/storage/data"
) )
# 2. 构建卷参数数组(将 -v 选项与路径值分离,避免解析问题)
local volume_args=()
for mapping in "${volume_mappings[@]}"; do
volume_args+=("-v" "$mapping")
done
# 端口映射列表(每个端口映射,便于维护和扩展) # 端口映射列表(每个端口映射,便于维护和扩展)
local port_mappings=( local port_mappings=(
8085 8085
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论