[英]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.