在Docker容器中执行for循环

Den*_*boy 5 bash docker

我使用码头集装箱进行卷曲

docker run --rm --network=mynetwork tutum/curl for i in `seq 1 10`; do curl -s http://Url; done
Run Code Online (Sandbox Code Playgroud)

但是输出是-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
...
Run Code Online (Sandbox Code Playgroud)

BMi*_*tch 5

正如Aaron所指出的那样,您需要在容器内有一个外壳程序来解析此行,而不是让它由解析docker命令的外壳程序解析。默认情况下,/bin/sh如果您未定义任何命令,则docker会将命令传递给入口点。而且,如果您尝试在docker cli上转义任何shell字符,它也会通过在/bin/sh命令行上转义它们来“帮助”您,从而防止您传递诸如;through之类的东西并由shell解析它或引用脚本并使用它由解析/bin/sh -c。如果在不分析脚本的情况下引用脚本,则会发现该脚本查找具有完整字符串名称的可执行文件。

正如您所发现的,解决方案是使用shell /bin/sh -c "your script"作为您的命令。请注意,你需要运行的脚本是一个单独的参数/bin/sh -c,别的都会被当作参数传递给该脚本(你可以读通过$0$1等等)。

结果命令应如下所示:

docker run --rm --network=mynetwork tutum/curl \
  /bin/sh -c 'for i in `seq 1 10`; do curl -s http://Url; done'
Run Code Online (Sandbox Code Playgroud)