I have some of my Docker containers bind to Tailscale IPs on the host. Even though I edited the Docker service to depend on tailscaled.service and it starts about 10 seconds after it, every once in a while Tailscale interface won’t be ready by the time the containers try to spin up after a reboot.
Since restart
policies do not apply to containers that has never started and ran at least for a while, Docker gives me no choice but to restart either those containers or the Docker daemon manually.
Is there a way to have Docker daemon try to restart containers even though they failed on the first try?
A restart policy only takes effect after a container starts successfully. In this case, starting successfully means that the container is up for at least 10 seconds and Docker has started monitoring it. This prevents a container which doesn’t start at all from going into a restart loop.
https://docs.docker.com/engine/containers/start-containers-automatically
You probably want to look into Health Checks. I believe you can tell Docker to “start service B when service A is healthy”, so you can define your health check with a script that depends on Tailscale functioning.
This is the correct answer, but you need a few things to clarify:
- The issue isn’t the Docker system service. Don’t make that depend on Tailscale
- Add a healthcheck and restart policy to the container to make it fail when conditions aren’t met, and restart until they are successful
- Build in some time tolerance at the service level inside the container to prevent it from flailing if your Tailscale healthchecks don’t pass after they initially start. Don’t rely solely on container health checks to ensure it works properly as that might not always be possible.
Considering it’s tailscale, one may want to have the service fail though as tailscale is sometimes not used for convenience but security concerns instead.
I need to figure this out on my immich stack. VM reboot only starts two out of the 4 services. Ty for the info.
deleted by creator
Delay the start of your containers with the tailscale dependency. Are you using required or depends_on in your docker-compose.yml
https://hatchjs.com/docker-compose-conditionally-start-service/
If you’re using kubernetes you can make the requirements at the pod level
https://stackoverflow.com/questions/69423932/container-initialization-order-in-pod-on-k8s
Edit: If using docker-compose.yml you can set a condition on a healthcheck
You can also specify a condition that must be met before the service is started. For example, the following configuration will start the
web
service only if thedb
service is healthy:version: ‘3.7’ services: web: image: nginx depends_on: – db condition: service_healthy
The
service_healthy
condition checks the health of thedb
service using thedocker-compose ps
command. If thedb
service is healthy, theweb
service will be started.deleted by creator
I’m happy with autoheal: https://github.com/willfarrell/docker-autoheal