簡體   English   中英

在docker容器中執行for循環

[英]Execute for loop in docker container

我使用一個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 如何以正確的方式執行此操作。 我希望看到輸出而不進入容器或檢查他們的日志。

例如,這有效:

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來解析這一行,而不是讓它由解析docker命令的同一個shell解析。 默認情況下,如果您沒有定義命令,docker會將命令傳遞給/bin/sh入口點。 如果你嘗試轉義docker cli上的任何shell字符,它會“幫助”你在/bin/sh命令行中轉義它們,這會阻止你傳遞像a ; 通過並在那里通過shell解析它或引用你的腳本並通過/bin/sh -c解析它。 如果您引用腳本而不解析它,您會發現它查找具有完整字符串名稱的可執行文件。

正如您所發現的,解決方案是使用/bin/sh -c "your script"作為命令運行shell。 請注意,您運行的腳本需要是/bin/sh -c的單個參數,其他任何內容都將作為args傳遞給該腳本(您可以使用$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解析為命令分隔符,所以這些是你正在執行的兩個命令:

  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 subshel​​l,這顯然會在兩個環境中產生相同的結果。

也許嘗試在bash腳本和循環中包裝docker調用?

#!/bin/bash
for i in {1..20}
do
   docker run -i -t --entrypoint curl http://Url;
done

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM