簡體   English   中英

如何在 bash 變量中捕獲 docker compose exec 命令

[英]how to capture docker compose exec command in bash variable

我正在編寫一個 bash 腳本來檢查在 docker 容器中運行的 mongodb 實例的狀態。 此代碼驗證我可以在容器內成功執行 mongo 命令:

cat <<END | docker-compose exec -T mongodb1 mongo --username root --password passwd
rs.status().myState
END

但是,我希望能夠將 rs.status().myState 的標准輸出存儲在一個變量中。 與此類似的東西:

MY_STATE=$(docker-compose exec -T mongodb1 mongo --username root --password passwd &&
rs.status().myState)

但我得到了異常: uncaught exception: ReferenceError: invalid assignment left-hand side如何捕獲容器內運行的 mongo shell 的輸出並將其存儲在變量中?

不管它在你的終端上是什么樣子,你都不能編寫一個首先啟動一些程序,然后再輸入一些輸入的 shell 腳本。 這就是你最后一次調用試圖做的事情。 如果您嘗試運行類似

some-command && \
input to some-command

然后首先命令運行完成,沒有輸入,然后 shell 嘗試將輸入作為第二個命令運行。

您的第一個命令可能更接近實際可行的東西。 如果輸入適合單行,那么我可能會寫

echo 'input to some-command' | some-command

或者,在您的命令更具體的情況下,

MY_STATE=$(echo 'rs.status().mystate' | docker-compose exec -T mongodb1 mongo --username root --password passwd)

您可能會在此處重新考慮是否真的需要docker-compose exec 如果沒有能力docker run一個可以接管整個主機系統的容器,你就無法運行它。 如果您的主機上有可用的 MongoDB 命令行工具,並且您已經使用 Compose ports:選項發布了一個端口,那么跳過docker-compose exec部分可能會起作用

MY_STATE=$(echo 'rs.status().mystate' | mongo --username root --password passwd)

如果您這樣做是為了進行健康檢查,那么要考慮的另一件事是,如果容器的主進程退出,該進程也將退出。 這並不總是 100% 的保證,一個容器很可能不退出但也不能正常工作,也許是在等待其環境中的某些東西重新出現(Kubernetes 有更豐富的健康檢查)。 但是,如果您可以依靠看到數據庫服務器退出,如果它變得不健康,那么您根本不需要這樣的檢查。

暫無
暫無

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

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