在Docker容器中执行for循环
我使用docker容器来执行curl
docker run --rm --network=mynetwork tutum/curl for i in `seq 1 10`; do curl -s http://Url; done
但输出是-bash: syntax error near unexpected token
do'` -bash: syntax error near unexpected token
。 我如何以适当的方式执行此操作。 我想看看输出,而不进入容器或检查他们的日志。
例如这个工程:
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 ...
正如Aaron所指出的那样,您需要在容器中使用一个shell来parsing这一行,而不是让它通过parsingdocker命令的同一个shell进行parsing。 默认情况下,如果没有定义,docker会将命令传递给/bin/sh
入口点。 如果你试图在docker cli上转义任何shell字符,它也会通过在/bin/sh
命令行中“逃脱”它们来“帮助”你,这样可以防止你传递类似的东西;
通过shell进行parsing,或者引用你的脚本,并用/bin/sh -c
parsing它。 如果引用脚本而不parsing脚本,则会发现它会查找具有完整string名称的可执行文件。
正如你所发现的,解决scheme是使用/bin/sh -c "your script"
作为命令运行一个shell。 请注意,您运行的脚本需要是/bin/sh -c
的单个参数,其他任何内容都将作为parameter passing给该脚本(您可以使用$0
, $1
等读取)。
结果命令应该如下所示:
docker run --rm --network=mynetwork tutum/curl \ /bin/sh -c 'for i in `seq 1 10`; do curl -s http://Url; done'
你的问题发生,因为;
当你的for
被你的容器外的bash
作为命令分隔符parsing后,所以这些是你正在执行的两个命令:
-
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
110子shell,在两种环境下显然会产生相同的结果。
也许尝试在bash脚本和循环中包装docker调用?
#!/bin/bash for i in {1..20} do docker run -i -t --entrypoint curl http://Url; done