Docker包装脚本在含空格工作目录失效的问题排查与修复
问题根源与修复方案
为什么含空格的目录会失效?
咱们先聊核心问题:原脚本把所有Docker运行选项拼接到一个字符串变量DOCKER_RUN_OPTIONS里,当工作目录路径包含空格时,shell会把空格当成参数分隔符,直接拆分这个字符串。比如你的工作目录是/home/user/My Documents,那--mount部分会被拆成:
--mount type=bind,source=/home/user/My Documents,target=/home/user/My Documents
这显然不是Docker能识别的合法参数,自然会报错。
修复方案:用数组存储命令参数
bash的数组可以完美处理带空格的参数元素,每个选项(哪怕是包含空格的完整参数)都会被当作独立单元传递给命令。重构后的脚本如下:
#!/usr/bin/env bash ## ## Dockerized ls ## set -eux # Only allocate tty if one is detected if [[ -t 0 ]]; then IT+=(-i); fi if [[ -t 1 ]]; then IT+=(-t); fi USER="$(id -u $(logname)):$(id -g $(logname))" WORKDIR="$(realpath .)" MOUNT="type=bind,source=${WORKDIR},target=${WORKDIR}" exec docker run --rm "${IT[@]}" --user "${USER}" --workdir "${WORKDIR}" --mount "${MOUNT}" busybox:latest ls "$@"
关键修改点
- 用数组
IT替代字符串存储-i/-t选项,每次添加选项时用IT+=(-i)的方式,确保每个选项是数组的独立元素 - 所有包含变量的Docker参数(
--user、--workdir、--mount)都用双引号包裹,避免变量中的空格被shell拆分 - 传递数组参数时用
"${IT[@]}"的语法,这种方式会把数组的每个元素作为独立的命令参数展开,完美保留空格
这样不管你的工作目录路径有没有空格,Docker都能正确解析所有参数,脚本就能正常运行啦。
内容的提问来源于stack exchange,提问作者dnk8n
相关产品推荐
相关产品推荐

