文章出處
文章列表
這是我們使用自建 docker swarm 集群后在部署時遇到的一個問題,使用 docker service update 命令更新服務時,
docker service update -d=false --force service_name
在更新的過程中服務有短暫的時間不能訪問。
該服務中運行的是 asp.net core web api ,所使用的 Dockerfile 如下:
FROM microsoft/aspnetcore:1.1.2 ARG PROJECT WORKDIR /app COPY ${PROJECT}/publish . RUN echo "dotnet ${PROJECT}.dll --urls http://*:80" > run.sh
通過在服務更新期間在另外一個容器中運行下面的 curl 命令捕捉這個問題:
while true;do curl -sSf -w '%{http_code}' cloud_api/alive;sleep 2;done
service update 期間不能訪問所更新的服務時,curl 會出現下面的輸出:
curl: (7) Failed to connect to cloud_api port 80: Connection refused 000
懷疑是容器啟動后,asp.net core web api 站點沒有立即開始工作,dotnet 命令啟動站點也需要一定的時間。
針對這個懷疑點,在 Dockcefile 中添加 HEALTHCHECK 指令,這樣可以讓 docker 在容器啟動后對容器內應用進行健康檢查,檢查通過才將容器投入使用。
HEALTHCHECK --interval=5s --timeout=20s \ CMD curl -fs localhost/alive || exit 1
注:localhost/alive 是容器內應用實現的一個健康檢查 url 。
添加 HEALTHCHECK 后重新構建鏡像并部署,執行 service update 命令問題沒有出現,搞定!
文章列表
全站熱搜