Docker脚本变量使用异常求助:docker exec参数错误及权限问题
解决Docker Exec变量定义与脚本执行错误问题
看起来你在脚本里踩了几个Bash语法和逻辑的坑,我来一步步帮你理清并修复:
核心问题拆解
从错误日志和代码来看,主要有这几个关键问题:
- 变量定义错误:你用
$()来定义cmd变量,这会直接执行docker exec -i dockerName命令,但这个命令缺少后续要运行的具体指令(比如stat或chmod),所以触发了"docker exec" requires at least 2 arguments的报错。 - 命令参数缺失+逻辑顺序错误:获取文件权限的命令里漏掉了
stat,而且你在复制文件到容器之前就去检查目标文件权限,此时文件还不存在,自然会提示No such file or directory。 - 变量名不匹配:你定义的变量是
cmd,但后面调用时用了$commandDocker,导致变量未定义,执行时会出错。 set -e的影响:这个选项会让脚本在任何命令失败时直接退出,前面的错误会直接终止脚本,后续逻辑根本跑不起来。
修正后的脚本
#!/bin/bash # 若需要保留set -e,建议添加错误处理逻辑,否则会因中间命令失败直接退出 # set -e # 正确定义命令前缀变量(存储字符串而非直接执行命令) cmd="docker exec -i dockerName" # 先创建本地目录(如果需要) mkdir -p /home/ubuntu/testie # 优先执行文件复制,确保容器内存在目标文件 sudo docker cp /home/user/test dockerName:/home/ubuntu/testie/ # 现在文件已存在,获取容器内文件的权限 filepermissions=$($cmd stat -c '%a' /home/ubuntu/testie/test) # 判断权限并执行对应操作 if [ "$filepermissions" == "777" ]; then echo "Free" else echo "Restrictive. Gonna give it freedom" $cmd chmod 777 /home/ubuntu/testie/test fi
关键修改点说明
- 变量定义方式修正:把
cmd=$(docker exec -i dockerName)改成cmd="docker exec -i dockerName",这样变量存储的是命令前缀字符串,需要使用时再拼接后续参数(比如$cmd stat ...),而不是提前执行无意义的命令。 - 调整执行顺序:先完成
docker cp文件复制操作,再去获取容器内文件的权限,确保目标文件已经存在。 - 补全缺失命令:在权限获取命令里加上
stat,让docker exec能正确调用stat命令读取权限值。 - 统一变量名:全程使用
$cmd变量,避免变量名不匹配导致的未定义错误。 - 可选调整
set -e:如果需要严格的错误终止,保留set -e但建议添加错误捕获逻辑;如果希望脚本在部分命令失败后继续执行,可以暂时去掉它。
这样修改后,脚本应该就能正常执行,不会再出现之前的报错了。
内容的提问来源于stack exchange,提问作者Sayrer
相关产品推荐
相关产品推荐

