docker 安裝部署 supervisor 小記

雪花飄發表於2020-07-05

最近工作中用到了 workerman,執行環境為 alpine 構建的基礎映象,計劃通過安裝 supervisor 來進行容器啟動後自動執行 workerman 程式並管理

  • 安裝 supervisor
    apk add --no-cache supervisor

docker 安裝部署 supervisor 小記
該報錯是 supervisor 伺服器還未開啟

  • 配置管理程式
    supervisor 預設配置檔案路徑為 /etc/supervisord.conf,為讓避免讓該配置檔案變成大粽子,我們自定義的配置檔案最好是獨立配置出來,檢視 /etc/supervisord.conf 檔案後面可以發現配置會載入同級目錄下 supervisor.d/*.ini 所有 ini 字尾的配置檔案

docker 安裝部署 supervisor 小記

  • 配置自定義檔案
    初步配置為以下
    [supervisord]
    logfile=/webser/logs/gatewayworker/supervisord.log
    pidfile=/var/supervisord.pid
    [program:gateway_worker]
    command=/usr/bin/php /webser/www/start.php start -d
    numprocs=1
    autostart=true
    autorestart=true
    startsecs=3
    stdout_logfile=/webser/logs/gatewayworker/supervisord_out.log
    stderr_logfile=/webser/logs/gatewayworker/supervisord_err.log
    日誌檔案我們當然是要配置對映出來了,免得重啟丟失日後排查問題需要是無法排查,pid 檔案如果不配置的話會預設生成在 supervisord.conf同級下,我們當然不希望它去汙染 etc 目錄了。gateway-worker 在容器裡只能起一個程式,要不會造成埠衝突。

docker 安裝部署 supervisor 小記
從上圖可以看見 supervisor 啟動服務端後,發現 gateway_worker 程式狀態是 fatal。通過日誌排查,報埠占用的問題,說明在多次重啟,為什麼呢?
網上了解到,supervisor 會將配置中程式以後臺的程式執行,配置中就不能再將命令配置在後臺執行了。
command=/usr/bin/php /webser/www/start.php start -d 將這條命令的「-d」去掉,看結果

docker 安裝部署 supervisor 小記

從圖中看出已經正常啟動了,注意這裡修改配置後使用 docker-compose 來重啟,否則會遇到另外一個問題,下面開講。
像上面如果修改了配置檔案,會出現意外情況

docker 安裝部署 supervisor 小記
可以看到存在重複的程式,到底怎麼回事?
究其原因是 reload 重新載入配置的時候,supervisor 只關掉了配置中的命令主程式,而命令內生成的子程式沒有停掉導致成了孤獨程式(這裡要手動 kill -9 程式號幹掉),如果多次重啟不斷出現孤獨程式那還得了。
其實 supervisor 是支援配置幹掉子程式的,如果配置

stopasgroup=true
killasgroup=true

docker 安裝部署 supervisor 小記
看這下不存在孤兒程式了,這下放心了。

  • 配置 supervisor 在容器啟動後自動開啟服務
    在此之前為了讓容器掛起,在 docker-compose 配置檔案一起使用的 command: "tail -f",現在肯定要成我們的 supervisor 命令了。
    command: "/usr/bin/supervisord -c /etc/supervisord.conf",只可惜結果未能如我所願,容器總是一啟即退出,這到底又是什麼情況?後來換了一種方案,加個啟動指令碼 start.sh, 在容器啟動執行這個指令碼command: "bash /var/start.sh",指令碼就是啟動 supervisor 服務,但未能如我所願。
    納悶!我印象中見過使用 supervisor 命令配置來掛起容器的,為什麼不行?到底哪裡出了問題?
    靜下心來蒐羅一下,才 get 到另一個點,supervisor 服務預設是以後臺程式啟動的, 我們再使用 docker-compose 的時候需要配置為前臺執行才能讓它起到掛起容器的作用。
    如何操作?將 supervisor 配置的 nodaemon=false 修改為 nodaemon=true,使 supervisor 以前臺的方式執行來維護容器的掛起狀態。
  • 最終配置是這樣的
    [supervisord]
    logfile=/webser/logs/gatewayworker/supervisord.log
    pidfile=/var/supervisord.pid
    nodaemon=true
    [program:gateway_worker]
    command=/usr/bin/php /webser/www/start.php start
    numprocs=1
    autostart=true
    autorestart=true
    startsecs=3
    stopasgroup=true
    killasgroup=true
    stdout_logfile=/webser/logs/gatewayworker/supervisord_out.log
    stderr_logfile=/webser/logs/gatewayworker/supervisord_err.log
本作品採用《CC 協議》,轉載必須註明作者和本文連結

雪花飄

相關文章