docker exec 命令執行無效果,不報錯的坑

2021-09-28 18:38:17 字數 1250 閱讀 1713

結論:需要關注是否有bash -c,開發的指令碼是否有#!/bin/bash

在測試環境準備中,docker容器初始化的時候,比如通過jenkins或python指令碼(paramiko)部署的時候,部署指令碼經常需要使用docker exec來執行語句,啟停容器內的服務。

由於開發的start.sh指令碼使用了相對路徑,必須進入路徑再執行./start.sh,所以我使用分號隔開先後兩條語句執行。例如

docker exec nebula_service0 bash -c "cd /usr/local/sandai/scheduler/sbin; ./start.sh restart; "
這裡首先有乙個要點,就是bash後面要帶-c,否則不支援多條命令。所有的命令需要以字串形式傳入,故使用雙引號,如果內部的命令需要引號,則需要轉義。

第二個要點,在paramiko裡,如果不帶restart; 最後的分號,就可能看不到最後乙個命令執行成功時的輸出(有點奇葩)。

結果執行了以後,有的服務能成功。但有的服務會出現沒報錯,就是服務沒重啟,執行了命令好像沒效果一樣。這就尷尬了,真的很影響問題定位~

詭異的是,直接用

docker exec -it nebula_service0 /bin/bash

cd /usr/local/sandai/scheduler/sbin; ./start.sh restart

進到容器裡面,然後再執行命令,就表現好好的,沒有任何問題

後來經過一番折騰發現,研發的start.sh不是所有的都規範

能夠成功的指令碼,第一行有

#!/bin/bash

[commands ..

]

而不能成功執行的指令碼,第一行沒有直譯器路徑,而是直接開始寫命令

[commands ..

]

所以辦法就有兩個:

第乙個辦法,讓開發規範指令碼,指令碼前面都加上#!/bin/bash

第二個辦法,使用sh start.sh或bash start.sh代替./start.sh,經測試無需直譯器路徑

docker exec nebula_service0 bash -c "cd /usr/local/sandai/scheduler/sbin; sh start.sh restart; "

docker exec執行多個命令詳解

docker exec命令能夠在執行著的容器中執行命令。docker exec命令的使用格式 docker exec options container name command arg.options說明 d,以後臺方式執行命令 e,設定環境變數 i,互動模式 t,設定tty u,使用者名稱或ui...

docker exec執行多個命令的操作

docker exec命令能夠在執行著的容器中執行命令。docker exec options container name command arg.d,以後臺方式執行命令 e,設定環境變數 i,互動模式 t,設定tty u,使用者名稱或uid,例如myuser myusergroup 通常comm...

Docker exec 宿主對容器執行命令 五

docker 下 exec 從宿主機對容器執行命名操作 docker exec it 互動可以進入容器 exec 也可以在宿主機對容器執行命令 docker attach 也是可以進入容器 1 遠端 執行命令 檔案操作 docker exec d nginx1 touch etc 1 txt d 後...