我使用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
...
答案 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
解析为命令分隔符,因此这些是您正在执行的两个命令:
bash
docker run --rm --network=mynetwork tutum/curl for i in `seq 1 10`
第二个是无效的,这就是你得到的错误意味着什么。
我认为你可以简单地用单引号括起你想要传递给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;