1. 程式人生 > 其它 >docker exec 執行指令碼失敗解決

docker exec 執行指令碼失敗解決

技術標籤:工作記錄

文章目錄

背景介紹

docker容器裡有一個指令碼,需要在使用的時候在後臺執行,但是通過docker exec 呼叫這個指令碼卻一直得不到想要的結果,於是開始了探究之路!

原始指令碼

docker exec -it service_name /bin/bash -c '/opt/start.sh'

這個start.sh的作用就是在後臺啟動兩個服務

#!/bash
nohup start1.sh > start1.log 2>&1 &
sleep 5
nohup start2.sh 2>
&1 & echo 'server started'

問題定位

1. 指令碼書寫不規範

從上述的命令中可以看到docker 啟動的時候用的式/bin/bash 而指令碼中指定的確實/bash.我們都知道指令碼第一行的內容指定了shell指令碼直譯器的路徑,而且這個指定路徑只能放在檔案的第一行。因此需要把指令碼中的第一行用/bin/bash替換了,使得它們用同一個直譯器

2.啟動引數有問題

docker exec 執行的過程中使用了-it這個引數,在這裡插入圖片描述

  • -t讓docker分配一個偽終端並繫結到容器的標準輸入上
  • -i則讓容器的標準輸入保持開啟.

這樣執行完後臺指令碼只能雲行第一個start.sh, 第二個並不能起作用,因為執行完了終端也退出了,

看到help 中, 有一個-d, 後臺雲行指令碼, 這一條剛好符合我們的要求

修改過程

docker exec -d service_name /bin/bash -c '/opt/start.sh'
#!/bin/bash
nohup start1.sh > start1.log 2>&1 &
sleep 5
nohup start2.sh 2>&1 &
echo 'server started'