如何将本地当前目录文件名列表传入Docker容器并解决zsh报错问题
报错原因
报错是zsh shell的语法解析问题:你在docker命令参数中直接使用(printf ...)写法时,zsh会将括号识别为通配符匹配规则,而非执行括号内的命令获取输出,因此触发bad pattern错误。你本地单独执行PROJECT_FILES=(printf ...)能成功,是因为该写法属于zsh的数组赋值语法,放到docker run的参数位置后,shell解析规则变化才会报错。
解决方案
方案1:将文件名作为容器启动参数传递
使用$()做命令替换,直接将printf输出作为docker run的参数即可:
docker build -t doc-validate . && docker run doc-validate $(printf "%s " $(ls -p | grep -v /))
执行后你的入口脚本中$@就能正常读取到所有文件名列表。
方案2:将文件名作为环境变量传递
同样使用$()做命令替换,把输出包裹在双引号内,避免文件名含空格、特殊字符时被意外拆分:
docker build -t doc-validate . && docker run --env PROJECT_FILES="$(printf "%s " $(ls -p | grep -v /))" doc-validate
执行后入口脚本即可正常读取PROJECT_FILES环境变量的值。
优化提示
如果目录下存在带空格、特殊字符的文件名,原有ls组合命令可能会出现拆分错误,可以改用zsh原生glob语法获取所有普通文件,兼容性更强:
# 作为参数传递的写法 docker build -t doc-validate . && docker run doc-validate *(.) # 作为环境变量传递的写法 docker build -t doc-validate . && docker run --env PROJECT_FILES="*(.)" doc-validate
内容的提问来源于stack exchange,提问作者Otávio Monteagudo
相关产品推荐
相关产品推荐

