やり方
docker service update --detach=false --force foo_service
という感じに__アップデートするパラメータは何も指定せず --force
だけを付けて docker sercice update
すれば良い__らしい。
すべてのサービスでリバランスしたければ↓こんな感じか(--detach
は本質的には関係ないが纏めて実行する時はfalseにしておけば待たずに済む)。
for s in $(docker service ls -q); do
docker service update --detach=false --force "$s"
done
利用シーン
例えば2ノードに対してレプリカ数6で docker service create --replicas=6 foo_service
のような感じにサービスを作成した場合、各ノードには3つずつのタスクが作成される。
ここで新たなノードが docker swarm join
で追加されて3ノードになった時はタスク数が各ノードに2つずつになるよう、既存ノードからは1個ずつ停止して新ノードでは2つ起動する、ということをやってほしいが自動的にはこれは行われない。つまり何もしなければ親ノードにはいつまでたっても何のタスクも起動せず旧ノードもずっと3タスクずつ起動しっぱなしということになる。
もちろん既存ノードがサーバ再起動などしてタスク実行が出来なくなったりすれば数を保つために新ノードの方にもタスクが起動し始めてくれるが、この挙動はサーバリソースを公平に使ってほしい場合は嬉しくない。
タスクを各ノードにリバランスする為のコマンドが無いかと思ってひと通り見てみたが、どうやらサブコマンド名やオプション名からそれらしいものは無いっぽいと分かる。が、ググったら #24103 のIssueに答えが書いてあって、試したら期待通りに動作してくれたのでここにメモを残す。