Halo, kalau kamu merasa tulisan saya ngebantu kamu, kamu bisa ucapkan terima kasih lewat saweria.

If you feel this website help you, you can donate at saweria.



Problem

Client complaint they can’t update their app on docker swarm cluster with error no suitable node (host-mode port already in use on 1 node) when they try to update app image.

Here’s their compose file

version: '3.8'

services:
  whoami:
    image: traefik/whoami
    ports:
      - target: 2001
        published: 2001
        mode: host
    command:
       # It tells whoami to start listening on 2001 instead of 80
       - --port=2001
       - --name=iamfoo
    deploy:
      #deploy at all server
      mode: global
      update_config:
        parallelism: 1
        delay: 10s
        order: start-first
        failure_action: rollback
      placement:
        constraints:
          - node.platform.os == linux

How To Fix The Problem

It was easy to fix that problem, you can check this github issue page.

We just need to change order to order: stop-first.

Here’s the full compose file

version: '3.8'

services:
  whoami:
    image: traefik/whoami
    ports:
      - target: 2001
        published: 2001
        mode: host
    command:
       # It tells whoami to start listening on 2001 instead of 80
       - --port=2001
       - --name=iamfoo
    deploy:
      #deploy at all server
      mode: global
      update_config:
        parallelism: 1
        delay: 10s
        #IT MUST USE stop-first!!!
        order: stop-first
        failure_action: rollback
      placement:
        constraints:
          - node.platform.os == linux

Here’s explanation about that at docker compose docs

order: Order of operations during rollbacks. 

One of stop-first (old task is stopped before starting new one).

start-first (new task is started first, and the running tasks briefly overlap) (default stop-first).

It means apps with network_mode: host cannot killed by new task, they must be stopped, then they will create a new task.