docker_startup_7085.sh 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533
  1. #########################################################################
  2. # File Name: docker_start.sh
  3. # Version: v1.3
  4. # Author: yangyangen
  5. # Mail: yangyangen@exocr.com
  6. # Created Time: 2024-12-19 12:39:10
  7. #########################################################################
  8. #!/bin/bash
  9. # startup docker container
  10. echo "-----------------------------易道博识DeepOCR识别服务Docker版本执行开始--------------------------------"
  11. port="7085" # 设置docker run -p参数中对外映射的端口号
  12. nvidia="5" # 设置要挂载的Nvidia显卡,默认全部显卡all,如果要修改指定显卡的话,举例:nvidia="0,2,3"
  13. forward="y" # 设置docker容器的端口转发模式:
  14. # 当forward="y"时,使用-p和--mac-address参数生效:将容器的端口映射到主机的端口上,可以从主机访问容器内部的服务;允许在启动容器时指定一个固定的 MAC 地址。
  15. # 当forward="n"时,指定对外映射端口的port参数和指定mac地址参数不在生效,将使用容器内的server.conf配置文件中指定的端口。表示容器内的所有端口将直接暴露在主机上,意味着容器和主机共享使用网络接口、IP 地址和端口。
  16. use_cpu="n" # 设置OCR识别服务是否需要CPU方式启动,y表示使用cpu模式,n表示不使用cpu模式,默认为不使用CPU模式。
  17. ip_port_node="5000" # 设置docker run -p参数中容器内的端口号,通常禁止修改,除非很清楚的知道修改该参数值的意义和造成的影响。
  18. pod_name="httpsrv_7085" # 指定容器名称,默认即可,通常不建议修改,否则会影响docker_shutdown.sh脚本的执行过程
  19. # 检查 forward 是否为 y 或 n
  20. if [[ "$forward" != "y" && "$forward" != "n" ]]; then
  21. echo "报错:forward 参数的值无效,请修改为等于 y 或 n。"
  22. exit 1
  23. fi
  24. # 检查 forward 是否为 y 或 n
  25. if [[ "$use_cpu" != "y" && "$use_cpu" != "n" ]]; then
  26. echo "报错:use_cpu 参数的值无效,请修改为等于 y 或 n。"
  27. exit 1
  28. fi
  29. # 检查系统是否安装了系统常见的命令工具包
  30. packages_list=(
  31. "pciutils" # 用于支持lspci命令
  32. "iproute" # 用于支持ss命令
  33. )
  34. # 用来记录未安装的包
  35. missing_packages_list=()
  36. echo "检查以下系统依赖相关部署包是否已安装:"
  37. for package in "${packages_list[@]}"; do
  38. if command -v dpkg &>/dev/null; then
  39. pkg_check_cmd="dpkg -l"
  40. pkg_name_check_cmd="dpkg -s"
  41. elif command -v rpm &>/dev/null; then
  42. pkg_check_cmd="rpm -q"
  43. pkg_name_check_cmd="rpm -q"
  44. else
  45. echo "错误:无法找到适用的包管理工具(dpkg 或 rpm)。"
  46. exit 1
  47. fi
  48. # 检查包是否已安装
  49. if $pkg_check_cmd "$package" &>/dev/null; then
  50. echo "$package 已安装"
  51. else
  52. echo "$package 未安装"
  53. missing_packages_list+=("$package")
  54. fi
  55. done
  56. # 如果有未安装的包,则退出并提示
  57. if [ ${#missing_packages_list[@]} -gt 0 ]; then
  58. echo "错误:以下部署包未安装,请安装后再试。"
  59. for pkg in "${missing_packages_list[@]}"; do
  60. echo "- $pkg"
  61. done
  62. exit 1
  63. fi
  64. echo "-------------------------------------------------------------------------------------------------"
  65. # 检查端口号是否为合法数字,且在有效范围内
  66. if [ "$forward" = "y" ]; then
  67. if ! [[ "$port" =~ ^[1-9][0-9]{0,4}$ ]] || (( port < 1 || port > 65535 )); then
  68. echo "报错:端口号 $port 无效。端口号必须是1到65535之间的正整数。"
  69. exit 1
  70. fi
  71. # 检查端口号是否已被占用
  72. if ss -tuln | grep ":$port " > /dev/null; then
  73. echo "报错:端口号 $port 已被占用。"
  74. exit 1
  75. fi
  76. # 端口号校验通过
  77. echo "DeepOCR服务端口号为 $port 校验通过,可以使用。"
  78. forwarding=$(sysctl net.ipv4.ip_forward | awk '{print $3}')
  79. if [ "$forwarding" -eq 1 ]; then
  80. echo "IPv4转发已开启。"
  81. else
  82. echo "报错:IPv4转发未开启,端口转发功能不可用,IPv4开启方法请参考:"
  83. echo "1.临时开启IPv4转发:临时开启会在操作系统重启后失效,执行命令为:sudo sysctl -w net.ipv4.ip_forward=1"
  84. echo "2.永久开启IPv4转发:请在/etc/sysctl.conf文件中将net.ipv4.ip_forward的值改为1,然后:wq进行保存。"
  85. echo "请注意:必须运行该命令将设置的参数生效:sudo sysctl -p && sudo systemctl restart docker"
  86. exit 1
  87. fi
  88. else
  89. # 如果 forward="n",提示不进行端口号校验
  90. echo "跳过转发的端口号校验,将使用 ${pod_name} 容器中DeepOCR服务的 /root/dist/conf/server.conf 中配置的端口进行对外访问。"
  91. echo "请检查 ${pod_name} 容器内的DeeoOCR端口号与宿主机端口号是否冲突,端口号是否被其他程序占用。"
  92. fi
  93. echo "-------------------------------------------------------------------------------------------------"
  94. # 检查是否存在 log 目录,如果没有则创建
  95. if [ ! -d "./log_7085/" ]; then
  96. # 尝试创建 log 目录
  97. if ! mkdir -p log_7085; then
  98. echo "报错:无法创建 log 目录,可能是没有写入权限。"
  99. exit 1
  100. fi
  101. log_created=true
  102. else
  103. # 检查是否有写入权限
  104. if [ ! -w "./log_7085" ]; then
  105. echo "报错:log 目录存在,但没有写入权限。"
  106. exit 1
  107. fi
  108. log_created=true
  109. fi
  110. # 如果目录创建成功并且有权限,输出创建成功的信息
  111. if [ "$log_created" = true ]; then
  112. echo "已创建DeepOCR服务日志目录,绝对路径为:$PWD/log"
  113. echo "日志名称默认为:httplog.txt,可以通过修改DeepOCR的server.conf配置文件的suffix=y参数进行控制是否要对脚本添加主机名,例如日志格式为:httplog_testdemo.txt"
  114. fi
  115. echo "-------------------------------------------------------------------------------------------------"
  116. # 查找当前目录下的所有.lic文件
  117. lic_file=($(find . -maxdepth 1 -type f -name '*.lic'))
  118. # 检查是否找到了lic授权文件
  119. if [ ${#lic_file[@]} -eq 0 ]; then
  120. echo "报错:没有找到后缀为.lic的授权文件。"
  121. exit 1
  122. elif [ ${#lic_file[@]} -gt 1 ]; then
  123. echo "报错:发现多个后缀为lic文件,请只保留一个。"
  124. exit 1
  125. fi
  126. echo "当前目录下的授权文件名称为: $(basename "$lic_file")"
  127. echo "-------------------------------------------------------------------------------------------------"
  128. # 检查 Docker 是否安装,并且版本是否大于等于 19.06
  129. if command -v docker &> /dev/null; then
  130. # 获取 Docker 版本
  131. docker_version=$(docker --version | awk '{print $3}' | sed 's/,//')
  132. # 提取主版本号和次版本号
  133. IFS='.' read -r major minor patch <<< "$docker_version"
  134. # 删除次版本号的前导零
  135. minor=$(echo $minor | sed 's/^0*//')
  136. # 检查版本是否大于等于 18.06
  137. if [ "$major" -gt 19 ] || { [ "$major" -eq 19 ] && [ "$minor" -ge 6 ]; }; then
  138. echo "Docker已安装,版本号为:$docker_version,符合版本要求。"
  139. else
  140. echo "报错:Docker版本 $docker_version 小于 19.06,不符合版本要求,请升级到 Docker 19.06 或以上版本。"
  141. exit 1
  142. fi
  143. # 检查 Docker 服务是否启动并正常运行
  144. if systemctl is-active --quiet docker; then
  145. echo "Docker服务已启动并正常运行。"
  146. else
  147. echo "报错:Docker服务未启动或运行异常,可执行命令尝试重新启动 Docker 服务:sudo systemctl restart docker"
  148. exit 1
  149. fi
  150. else
  151. echo "报错:Docker服务未安装,请联系易道博识获取 Docker 部署包和部署手册,待安装 Docker 后重试。"
  152. exit 1
  153. fi
  154. echo "-------------------------------------------------------------------------------------------------"
  155. # 检查当前用户是否具有执行docker命令的权限
  156. # 检查当前用户是否是 root
  157. if [ "$(whoami)" = "root" ]; then
  158. echo "当前用户 $(whoami) 有权限执行 Docker 命令。"
  159. else
  160. # 检查当前用户是否在 docker 组中
  161. if ! groups $(whoami) | grep -q '\bdocker\b'; then
  162. echo "报错:当前用户 $(whoami) 不在 docker 组中,无法执行 Docker 命令。"
  163. echo "请将当前用户添加到 docker 组:sudo usermod -aG docker $(whoami)"
  164. echo "然后退出bash并重新登录,或者运行 'newgrp docker' 来应用更改。"
  165. exit 1
  166. else
  167. echo "当前用户 $(whoami) 有权限执行 Docker 命令。"
  168. fi
  169. fi
  170. echo "-------------------------------------------------------------------------------------------------"
  171. # 检查设置模型使用显卡显存的系数。
  172. # 初始化环境变量命令
  173. env_command=""
  174. if [ $# -eq 2 ]; then
  175. echo "设置模型使用显卡显存的系数的环境变量"
  176. arg1="$1"
  177. arg2="$2"
  178. if [ "$1" != "limit_gpu_memory" ]; then
  179. echo "参数错误:第一个参数只能是 'limit_gpu_memory'"
  180. exit 1
  181. fi
  182. if [ "$arg1" = "limit_gpu_memory" ]; then
  183. # 检查第二个参数是否为小数点后最多两位的小数,并且值不大于1.0
  184. if [[ "$arg2" =~ ^0(\.[0-9]{1,2})?$|^1(\.0{1,2})?$ ]]; then
  185. env_command="-e TF_PER_PROCESS_GPU_MEMORY_FRACTION=$arg2"
  186. # echo "env set $arg1=$arg2"
  187. else
  188. echo "请将limit_gpu_memory的值修改为小于1.0的浮点值,小数点后保留两位"
  189. exit 1
  190. fi
  191. fi
  192. fi
  193. if [ -z "$env_command" ]; then
  194. echo "没有指定 limit_gpu_memory 的显存系数。"
  195. else
  196. echo "limit_gpu_memory 的显存系数为:$arg1=$arg2"
  197. fi
  198. echo "-------------------------------------------------------------------------------------------------"
  199. # 检查docker中是否存在当前需要部署的docker镜像
  200. if [ ! -s version.txt ]; then
  201. echo "报错:文件 version.txt 不存在或内容为空。"
  202. exit 1
  203. fi
  204. image_name=$(cat version.txt)
  205. if docker inspect --type=image $image_name &> /dev/null; then
  206. echo "镜像为 $image_name 已存在,无需重复导入"
  207. else
  208. echo "请耐心等待,正在导入Docker镜像"
  209. if ! docker load -i ${PWD}/Deep_OCR_Docker.tar; then
  210. echo "导入Docker镜像失败"
  211. exit 1
  212. fi
  213. echo "导入已完成,镜像名称为: ${image_name}"
  214. fi
  215. echo "-------------------------------------------------------------------------------------------------"
  216. # 查找当前目录下的server.conf配置文件
  217. server_conf=$(find . -maxdepth 1 -type f -name 'server.conf')
  218. server_conf_arg=""
  219. if [ -n "$server_conf" ]; then
  220. server_conf_arg="-v ${PWD}/server.conf:/root/dist/conf/server.conf"
  221. echo "已向容器内部映射server.conf文件"
  222. fi
  223. # 查找当前目录下的httpsrv启动文件
  224. httpsrv=$(find . -maxdepth 1 -type f -name 'httpsrv')
  225. httpsrv_arg=""
  226. if [ -n "$httpsrv" ]; then
  227. chmod +x httpsrv
  228. httpsrv_arg="-v ${PWD}/httpsrv:/root/dist/httpsrv/httpsrv"
  229. echo "已向容器内部映射httpsrv文件"
  230. fi
  231. # 查找当前目录下的apis.conf启动文件
  232. apis_conf=$(find . -maxdepth 1 -type f -name 'apis.conf')
  233. apis_conf_arg=""
  234. if [ -n "$apis_conf" ]; then
  235. apis_conf_arg="-v ${PWD}/apis.conf:/root/dist/conf/apis.conf"
  236. echo "已向容器内部映射apis.conf文件"
  237. fi
  238. # 查找当前目录下的libpywrap_tc.so启动文件
  239. libpywrap_tc=$(find . -maxdepth 1 -type f -name 'libpywrap_tc.so')
  240. libpywrap_tc_arg=""
  241. if [ -n "$libpywrap_tc" ]; then
  242. libpywrap_tc_arg="-v ${PWD}/libpywrap_tc.so:/root/dist/httpsrv/libpywrap_tc.so"
  243. echo "已向容器内部映射libpywrap_tc.so文件"
  244. fi
  245. # 查找当前目录下的libpywrap.so启动文件
  246. libpywrap=$(find . -maxdepth 1 -type f -name 'libpywrap.so')
  247. libpywrap_arg=""
  248. if [ -n "$libpywrap" ]; then
  249. libpywrap_arg="-v ${PWD}/libpywrap.so:/root/dist/httpsrv/libpywrap.so"
  250. echo "已向容器内部映射libpywrap.so文件"
  251. fi
  252. # 查找当前目录下的libpywrap.so启动文件
  253. libpaddle_inference=$(find . -maxdepth 1 -type f -name 'libpaddle_inference.so')
  254. libpaddle_inference_arg=""
  255. if [ -n "$libpaddle_inference" ]; then
  256. libpaddle_inference_arg="-v ${PWD}/libpaddle_inference.so:/root/dist/httpsrv/libpaddle_inference.so"
  257. echo "已向容器内部映射libpaddle_inference.so文件,建议仅限CPU模式时使用。"
  258. fi
  259. echo "-------------------------------------------------------------------------------------------------"
  260. # 检查系统是否安装了 nvidia-smi 驱动工具,并且是否有显卡设备
  261. nvidia_gpus=""
  262. # 设置cpu模式的docker命令参数
  263. cpu_mode=""
  264. packages=(
  265. "libnvidia-container1" # docker挂载显卡时需要
  266. "nvidia-container-toolkit" # docker挂载显卡时需要
  267. #"nvidia-container-toolkit-base"
  268. "libnvidia-container-tools" # docker挂载显卡时需要
  269. )
  270. # 用来记录未安装的包
  271. missing_packages=()
  272. if [ -f "./libpaddle_inference.so" ] || [ "$use_cpu" = "y" ]; then
  273. echo "检测到当前目录下存在 libpaddle_inference.so 文件,或者环境变量 use_cpu=y ,跳过显卡加载过程。将使用 CPU 模式启动OCR识别服务。"
  274. cpu_mode="-e use_cpu=y"
  275. nvidia_gpus="" # 如果检测到该文件,设置显卡挂载为空
  276. else
  277. cpu_mode=""
  278. # 检查 PCIe 总线上是否存在 NVIDIA 硬件设备
  279. if lspci | grep -i "nvidia" >/dev/null 2>&1; then
  280. echo "检测到 NVIDIA 显卡硬件设备。"
  281. # 检查是否安装了 nvidia-smi 驱动工具
  282. if command -v nvidia-smi &>/dev/null; then
  283. echo "检测到 nvidia-smi 驱动工具。"
  284. # 检查是否可以检测到 NVIDIA GPU
  285. if nvidia-smi -L >/dev/null 2>&1; then
  286. echo "已检测到 NVIDIA GPU。"
  287. # 根据 nvidia 的值来设置 nvidia_gpus
  288. if [ "$nvidia" = "all" ]; then
  289. nvidia_gpus="--gpus all"
  290. echo "默认已向容器内部挂载所有 NVIDIA 显卡。"
  291. elif [[ "$nvidia" =~ ^[0-9,]+$ ]]; then
  292. nvidia_gpus="--gpus '\"device=$nvidia\"'"
  293. echo "指定了显卡设备 $nvidia,已挂载指定显卡。"
  294. else
  295. echo "警告:指定的显卡的内容格式无效,无法挂载。请重新修改第16行的值。"
  296. nvidia_gpus=""
  297. exit 1
  298. fi
  299. # 如果检测到显卡驱动,才检查相关的 NVIDIA 容器包
  300. echo "检查以下 NVIDIA 相关部署包是否已安装:"
  301. for package in "${packages[@]}"; do
  302. if command -v dpkg &>/dev/null; then
  303. pkg_check_cmd="dpkg -l"
  304. pkg_name_check_cmd="dpkg -s"
  305. elif command -v rpm &>/dev/null; then
  306. pkg_check_cmd="rpm -q"
  307. pkg_name_check_cmd="rpm -q"
  308. else
  309. echo "错误:无法找到适用的包管理工具(dpkg 或 rpm)。"
  310. exit 1
  311. fi
  312. # 检查包是否已安装
  313. if $pkg_check_cmd "$package" &>/dev/null; then
  314. echo "$package 已安装"
  315. else
  316. echo "$package 未安装"
  317. missing_packages+=("$package")
  318. fi
  319. done
  320. # 如果有未安装的包,则退出并提示
  321. if [ ${#missing_packages[@]} -gt 0 ]; then
  322. echo "错误:以下部署包未安装,不能挂载nvidia显卡设备到OCR识别容器中进行使用,请安装后再试。"
  323. for pkg in "${missing_packages[@]}"; do
  324. echo "- $pkg"
  325. done
  326. exit 1
  327. fi
  328. else
  329. echo "警告:未检测到 NVIDIA GPU,可能是驱动安装不正确或没有 GPU 显卡。将使用CPU模式运行OCR服务。CPU模式请修改该启动脚本的第22行为use_cpu="y",或者请联系易道博识获取 libpaddle_inference.so 文件才能进行识别。"
  330. nvidia_gpus=""
  331. fi
  332. else
  333. echo "警告:未检测到 nvidia-smi 驱动工具,无法使用 NVIDIA 显卡,将使用CPU模式运行OCR服务。CPU模式请修改该启动脚本的第22行为use_cpu="y",或者请联系易道博识获取 libpaddle_inference.so 文件才能进行识别。"
  334. nvidia_gpus=""
  335. fi
  336. else
  337. echo "警告:未检测到 NVIDIA 显卡硬件设备,将使用CPU模式运行OCR服务。CPU模式请修改该启动脚本的第22行为use_cpu="y",或者请联系易道博识获取 libpaddle_inference.so 文件才能进行识别。"
  338. nvidia_gpus=""
  339. fi
  340. fi
  341. echo "挂载到 ${pod_name} 容器内的显卡为:nvidia_gpus: $nvidia_gpus"
  342. echo "-------------------------------------------------------------------------------------------------"
  343. network=""
  344. mac_address=""
  345. # 如果 forward 为 y,检测 MAC 地址和端口号
  346. if [ "$forward" = "y" ]; then
  347. # 获取已启动并有效网卡的 MAC 地址
  348. mac_address=$(ip link show | awk '/state UP/ && !/lo/ {getline; print $2; exit}')
  349. if [ -z "$mac_address" ]; then
  350. echo "警告:没有检测到已启动并且有效的网卡MAC地址。"
  351. exit 1
  352. fi
  353. ip_port="-p ${port}:${ip_port_node}"
  354. mac_address="--mac-address ${mac_address}"
  355. echo "检测到的MAC地址为: ${mac_address}"
  356. echo "指定端口映射为:${ip_port}"
  357. else
  358. # 如果 forward 为 n,设置 network 为 host
  359. network="--network host"
  360. echo "指定 ${pod_name} 容器使用 主机网络模式 :${network}"
  361. echo "对外映射端口的 port 参数不在生效,将使用 ${pod_name} 容器内的 /root/dist/conf/server.conf 配置文件中 listening_port 指定的端口。"
  362. fi
  363. echo "-------------------------------------------------------------------------------------------------"
  364. docker_cmd="docker run -itd --name=${pod_name} \
  365. ${ip_port} \
  366. ${network} \
  367. ${cpu_mode} \
  368. ${mac_address} \
  369. ${nvidia_gpus} \
  370. --restart=on-failure \
  371. --workdir /root/dist \
  372. -v ${PWD}/log_7085:/root/dist/log \
  373. -v ${PWD}/$(basename $lic_file):/root/dist/licence/$(basename $lic_file) \
  374. -v ${PWD}/ptxas.12.2:/root/dist/httpsrv/ptxas \
  375. -v /usr/lib/x86_64-linux-gnu/libcuda.so.570.169:/root/dist/httpsrv/libcuda.so.1 \
  376. -v /usr/lib/x86_64-linux-gnu/libnvidia-ml.so.570.169:/root/dist/httpsrv/libnvidia-ml.so.1 \
  377. ${libpaddle_inference_arg} \
  378. ${apis_conf_arg} \
  379. ${env_command} \
  380. ${server_conf_arg} \
  381. ${httpsrv_arg} \
  382. ${libpywrap_tc_arg} \
  383. ${libpywrap_arg} \
  384. ${image_name} sh startup.sh"
  385. # 打印完整的 docker run 命令
  386. echo "执行的 Docker 命令为:$docker_cmd"
  387. # 执行 docker run 命令
  388. if ! eval "$docker_cmd"; then
  389. echo "启动 Docker 容器失败"
  390. exit 1
  391. fi
  392. echo "------------------${pod_name} 容器已启动,正在检查容器运行状态,请耐心等待------------------------------"
  393. # 获取 容器的 ID 或名称
  394. container_id=$(docker ps -aq --filter "name=^${pod_name}$" | tr -d '\r\n\t ')
  395. # 等待 3 秒后,检查容器状态
  396. sleep 3
  397. # 获取容器当前的状态
  398. container_status=$(docker inspect --format '{{.State.Status}}' $container_id | tr -d '\r\n\t ')
  399. # 如果容器状态是 running,则认为启动成功
  400. if [ "$container_status" == "running" ]; then
  401. # 再次确认 3 秒内容器状态是否稳定为 running
  402. sleep 3
  403. container_status=$(docker inspect --format '{{.State.Status}}' $container_id | tr -d '\r\n\t ')
  404. if [ "$container_status" == "running" ]; then
  405. echo "易道博识Docker版本DeepOCR服务启动完成。 ${pod_name} 容器状态为:$container_status"
  406. else
  407. echo "Docker中容器名称为 ${pod_name} 启动失败,再次检查容器状态不再是 running。当前状态为:$container_status ,请联系易道博识的技术支持人员排查问题。"
  408. exit 1
  409. fi
  410. else
  411. echo "报错:Docker中容器名称为 ${pod_name} 启动失败,容器状态为:$container_status ,请联系易道博识的技术支持人员排查问题。"
  412. exit 1
  413. fi
  414. echo "-------------------------------------------------------------------------------------------------"
  415. # 根据不同的端口映射方式,输出不同提示内容
  416. listening_port=$(docker exec -it ${pod_name} bash -c "grep '^listening_port' /root/dist/conf/server.conf | awk -F'=' '{print \$2}'" | tr -d '\r\n\t ')
  417. port_value=$(echo $ip_port | cut -d ':' -f 2)
  418. if [ "$forward" = "y" ]; then
  419. # 检查 listening_port 和 port_value 是否一致
  420. if [ "$listening_port" != "$port_value" ]; then
  421. echo "警告:${pod_name} 容器虽然启动成功,但是 ${pod_name} 容器内/root/dist/conf/server.conf的listening_port:($listening_port) 与 脚本第21行的 ip_port_node :($ip_port_node) 中指定容器内端口号不一致!"
  422. echo "请将 ${pod_name} 容器内/root/dist/conf/server.conf的listening_port:($listening_port) ,修改为默认的 (5000);或者修改本脚本第22行 ip_port_node 的值与之保持一致。"
  423. echo "修改一致后,需要停止并删除运行当前 ${pod_name} 容器后: docker rm -f ${pod_name} ,重新执行该脚本再次启动容器生效。"
  424. exit 1
  425. fi
  426. echo "DeepOCR服务当前端口号为:${port},如需修改DeepOCR转发端口号,请将该脚本第14行 port 的 ${port} 修改为指定的有效值。"
  427. echo "查看DeepOCR服务的版本号:curl http://localhost:${port}/version"
  428. echo "查看DeepOCR服务授权信息:curl http://localhost:${port}/authorize"
  429. else
  430. # 如果 forward="n",提示不进行端口号校验
  431. # 使用 docker exec 获取 listening_port,并去除多余的换行符或空格
  432. echo "DeepOCR服务当前端口号为:$listening_port"
  433. # 检查端口号是否已被占用
  434. if ss -tuln | grep ":$listening_port " > /dev/null; then
  435. echo "报错:httpsrv 容器内的 /root/dist/conf/server.conf 中配置的 listening_port 端口号 $listening_port 已被占用。"
  436. echo "端口号与宿主机共用,如需指定DeepOCR服务端口,请对 ${pod_name} 容器内的 /root/dist/conf/server.conf 中配置的 listening_port 端口进行修改,已确保端口号不与其他进程端口号造成冲突。"
  437. exit 1
  438. fi
  439. echo "查看DeepOCR服务的版本号:curl http://localhost:${listening_port}/version"
  440. echo "查看DeepOCR服务授权信息:curl http://localhost:${listening_port}/authorize"
  441. fi
  442. echo "1.如需限制OCR模型占用显卡显存资源,可以执行命令,例如:./docker_startup.sh limit_gpu_memory 0.8"
  443. echo "2.如需查看服务日志,可以通过执行命令:tail -100f log/httplog.txt 或 docker exec -it ${pod_name} tail -f log/httplog.txt"
  444. echo "3.如需查看服务运行状态,可以通过执行命令:docker ps -a | grep ${pod_name}"
  445. echo "4.如需查看容器内的DeepOR服务进程运行情况,可以通过执行命令:docker exec -it ${pod_name} ps -ef | grep httpsrv"
  446. echo "---------------------------易道博识DeepOCR识别服务Docker版本执行已完毕-------------------------------"