在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 -cparsing它。 如果引用脚本而不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后,所以这些是你正在执行的两个命令:

  1. docker run --rm --network=mynetwork tutum/curl for i in `seq 1 10`
  2. 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