在docker容器中执行for循环

时间:2017-02-28 13:13:51

标签: bash docker

我使用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'`。 如何以正确的方式执行此操作。我希望看到输出而不进入容器或检查他们的日志。

例如,这有效:

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
...

3 个答案:

答案 0 :(得分:4)

正如Aaron指出的那样,你需要在容器内部使用一个shell来解析这一行,而不是让它被解析docker命令的同一个shell解析。默认情况下,如果您没有定义一个命令,docker会将命令传递给/bin/sh入口点。如果您尝试在docker cli上转义任何shell字符,它会帮助"你也可以在/bin/sh命令行中转义它们,这会阻止你传递类似;之类的内容,并通过shell解析它,或者引用你的脚本并让它由{{1}解析}。如果你引用脚本而不解析它,你会发现它找到一个带有完整字符串名称的可执行文件。

正如您所发现的,解决方案是以/bin/sh -c作为命令运行shell。请注意,您运行的脚本需要是/bin/sh -c "your script"的单个参数,其他任何内容都将作为args传递给该脚本(您可以使用/bin/sh -c$0等阅读)。

结果命令应如下所示:

$1

答案 1 :(得分:3)

您的问题发生是因为a.get之后的;被容器外的for解析为命令分隔符,因此这些是您正在执行的两个命令:

  1. bash
  2. docker run --rm --network=mynetwork tutum/curl for i in `seq 1 10`
  3. 第二个是无效的,这就是你得到的错误意味着什么。

    我认为你可以简单地用单引号括起你想要传递给docker的命令:

    do curl -s http://Url; done

    在双引号上使用单引号意味着命令不会在当前shell中扩展,而是在docker组件中扩展。这里没有关系,唯一要扩展的是docker run --rm --network=mynetwork tutum/curl 'for i in $(seq 1 10); do curl -s http://Url; done' 子shell,这显然会在两种环境中产生相同的结果。

答案 2 :(得分:0)

也许尝试用bash脚本包装docker call并循环?

#standardSQL
WITH SampleDates AS (
  SELECT DATE '2017-01-01' AS d UNION ALL
  SELECT DATE '2017-02-28' AS d UNION ALL
  SELECT DATE '2016-12-15' AS d
)
SELECT
  EXTRACT(YEAR FROM d) AS year,
  FORMAT_DATE('%V', d) AS iso_week
FROM SampleDates;