docker exec 執行指令碼失敗解決
阿新 • • 發佈:2021-01-12
技術標籤:工作記錄
文章目錄
背景介紹
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'