If you’re deploying PiHole to a docker swarm cluster, it’s likely that you’re seeing the container exit after 3 minutes with a status message of “completed” - which is a bit strange, given that it’s a DNS server and its job is only complete when it’s replaced with a new one.

This is a failure of the healthcheck system built into Docker - for some reason, healthy containers are considered “done” and pruned + replace. This…does not make sense.

Fortunately, these checks can be easily disabled:

version: '3.8'
    image: pihole/pihole:latest
      disable: true
    # ...rest of your service definition goes here

That’s it! I’m going to investigate the problem a little bit further and figure out exactly why that’s happening, but for the time being, this is a good enough workaround for me.