簡體   English   中英

從bash提示符和腳本向docker exec傳遞參數

[英]passing arguments to docker exec from bash prompt and script

我正在嘗試在我的mongodb docker容器中執行命令。 從我的linux命令提示符開始,它非常簡單,當我這樣做時可以工作

docker exec -it d886e775dfad mongo --eval 'rs.isMaster()'

上面告訴我去一個容器並執行命令

"mongo --eval 'rs.isMaster()' - This tells mongo to take rs.isMaster() as an input and execute it. This works and gives me the output.

因為我試圖通過bash腳本自動執行此操作,所以我這樣做了

cmd="mongo --eval 'rs.isMaster()"

然后嘗試像這樣執行

docker -H $node2 exec d886e775dfad "$cmd"

但我想不知何故,docker認為現在容器內的二進制文件不是mongo或者其他而且它給了我以下錯誤:

rpc error: code = 2 desc = oci runtime error: exec failed: container_linux.go:247: starting container process caused "exec: \"mongo --eval 'rs.isMaster()'\": executable file not found in $PATH"
docker exec -it d886e775dfad sh -c "mongo --eval 'rs.isMaster()'"

這會調用shell( sh )在引號中執行腳本。 請注意,這也修復了通配符(*)之類的問題,否則它們與docker exec無法正常工作。

看起來好像mongo將$cmd的全部內容解釋為要執行的命令。 這是有道理的,因為您在命令行上引用了參數。 基本上當你... exec "$cmd" ,shell將解釋美元符號並將其擴展為就地內容。 接下來它將解釋雙引號並傳遞整個內部內容(現在是mongo --eval 'rs.isMaster()'作為進程的單個命令行參數。這應該導致mongo查找具有名稱的程序mongo --eval 'rs.isMaster()在你的路徑中。顯然不存在。

你需要運行(在你的例子中有一個缺少的單引號):

cmd="mongo --eval 'rs.isMaster()'"

接下來是(沒有$cmd附近的報價):

docker -H $node2 exec d886e775dfad $cmd

通過在$cmd附近包含引號,您正在尋找可執行文件mongo --eval 'rs.isMaster()'而不是使用args mongo , - --eval'rs.isMaster()'的可執行文件mongo

暫無
暫無

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

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