nginx no recoge automáticamente los cambios dns en enjambre

Estoy ejecutando nginx a través de lets-nginx en la configuration pnetworkingeterminada de nginx (según el proyecto lets-nginx) en un enjambre de acopladores:

services:

ssl: image: smashwilson/lets-nginx networks: - backend environment: - EMAIL=sas@finestructure.co - DOMAIN=api.finestructure.co - UPSTREAM=api:5000 ports: - "80:80" - "443:443" volumes: - letsencrypt:/etc/letsencrypt - dhparam_cache:/cache api: image: registry.gitlab.com/project_name/image_name:0.1 networks: - backend environment: - APP_SETTINGS=/api.cfg configs: - source: api_config target: /api.cfg command: - run - -w - tornado - -p - "5000" 

api es una aplicación de matraz que se ejecuta en el puerto 5000 en el backend networking de superposition de enjambres.

Cuando los services se inician inicialmente todo funciona bien. Sin embargo, cada vez que actualizo la api de una manera que hace que el contenedor api mueva entre los nodos en el enjambre de tres nodos, nginx falla al enrutar el tráfico al nuevo contenedor.

Puedo ver en los loggings de nginx que se adhiere a la antigua IP interna, por ejemplo 10.0.0.2, cuando el nuevo contenedor está ahora en 10.0.0.4.

Para que nginx 'vea' la nueva IP, necesito reiniciar el contenedor nginx o el docker exec en ella y kill -HUP al process nginx.

¿Existe una forma mejor y automática de hacer que el contenedor nginx actualice su resolución de nombre?

Gracias al puntero de @Moema, he encontrado una solución para esto. La configuration pnetworkingeterminada de lets-nginx debe ajustarse de la siguiente manera para hacer que nginx recoja los cambios de IP:

  resolver 127.0.0.11 ipv6=off valid=10s; set $upstream http://${UPSTREAM}; proxy_pass $upstream; 

Esto usa la resolución del enjambre de Docker con un TTL y establece una variable, obligando a nginx a actualizar las búsquedas de nombres en el enjambre.