我使用docker容器来执行卷曲
docker run --rm --network=mynetwork tutum/curl for i in `seq 1 10`; do curl -s http://Url; done但是输出是-bash: syntax error near unexpected tokendo'`。如何以正确的方式执行此操作。我希望在不进入容器内部或检查其日志的情况下查看输出。
例如,这是可行的:
docker run --rm -d -it --network=mynetwork tutum/curl /bin/sh
docker exec -it 4e8cb1e8c9fb bash
root@4e8cb1e8c9fb:/# for i in `seq 1 20`; do curl http://Url; done
curl: (6) Could not resolve host: url
curl: (6) Could not resolve host: url
curl: (6) Could not resolve host: url
curl: (6) Could not resolve host: url
curl: (6) Could not resolve host: url
curl: (6) Could not resolve host: url
...发布于 2017-02-28 21:50:01
正如Aaron所指出的,您需要容器中的一个shell来解析这行代码,而不是让解析docker命令的同一个shell来解析它。默认情况下,如果您没有定义/bin/sh入口点,docker会将命令传递给该入口点。如果您尝试转义docker cli上的任何shell字符,它会通过在/bin/sh命令行上转义它们来“帮助”您,这会阻止您传递;之类的东西并由shell解析,或者引用您的脚本并由/bin/sh -c解析它。如果您引用该脚本而不对其进行解析,您会发现它查找的是具有完整字符串名称的可执行文件。
正如您所发现的,解决方案是以/bin/sh -c "your script"作为命令运行一个shell。请注意,您运行的脚本需要是/bin/sh -c的单个参数,其他任何内容都将作为args传递给该脚本(您可以使用$0、$1等进行读取)。
生成的命令应如下所示:
docker run --rm --network=mynetwork tutum/curl \
/bin/sh -c 'for i in `seq 1 10`; do curl -s http://Url; done'发布于 2017-02-28 21:27:37
您的问题发生是因为for之后的;被容器外部的bash解析为命令分隔符,所以这是您正在执行的两个命令:
docker run --rm --network=mynetwork tutum/curl for i in `seq 1 10`do curl -s http://Url; done第二个是无效的,这就是你得到的错误的意思。
我认为你可以简单地用单引号将你想要传递给docker的命令括起来:
docker run --rm --network=mynetwork tutum/curl 'for i in $(seq 1 10); do curl -s http://Url; done'使用单引号而不是双引号意味着命令不会在当前的shell中展开,而是在docker组件中展开。这在这里无关紧要,因为唯一要展开的是seq 1 10子外壳,它显然会在两种环境中产生相同的结果。
发布于 2017-02-28 21:21:37
也许可以尝试在bash脚本和循环中包装docker调用?
#!/bin/bash
for i in {1..20}
do
docker run -i -t --entrypoint curl http://Url;
donehttps://stackoverflow.com/questions/42509726
复制相似问题