执行docker exec内嵌curl命令时出现curl:(3) URL格式非法报错如何解决
问题原因
你遇到的报错是Shell变量提前展开导致的,具体逻辑如下:
- 你给
sh -c传递参数时使用了外层双引号,当前执行命令的宿主机Shell会在将命令传入Docker容器之前,优先把双引号包裹的$website变量展开 - 宿主机环境中没有定义过
website变量,所以展开后实际传入容器执行的命令为:echo 'Input Website:'; read website; echo 'Searching..'; sleep 1; curl http://;,无论你后续在容器的交互输入中填入什么值,curl的请求地址已经被替换为空值,自然会触发URL格式错误。
修复方案
方案1:将sh -c的外层包裹符改为单引号
单引号包裹的内容不会被宿主机Shell提前展开,变量会保留到容器内部执行时再解析,注意调整内部echo的引号避免冲突:
docker exec -it missingDependencies sh -c 'echo "Input Website:"; read website; echo "Searching.."; sleep 1; curl http://$website;'
方案2:给变量标识符加转义符
如果你需要保留外层双引号(比如有其他需要宿主机提前展开的变量),给$前加转义符阻止当前Shell提前展开该变量即可:
docker exec -it missingDependencies sh -c "echo 'Input Website:'; read website; echo 'Searching..'; sleep 1; curl http://\$website;"
内容的提问来源于stack exchange,提问作者Eric Goto
相关产品推荐
相关产品推荐

