es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Configuración de Traefik docker para enrutamiento basado en rutas con reescritura.

Nuevo usuario en traefik desde hace 2 días, necesito ayuda con lo que creo que es una configuración básica para el primer proveedor de Docker en traefik v2…

He intentado buscar en la documentación, pero no puedo entender cómo hacer lo que quiero.

Me gustaría tener contenedores Docker como:
– app1
– app2
– app3

Y acceder a ellos a través de traefik mediante las siguientes URL:
– http://app.mydomain.com/app1
– http://app.mydomain.com/app2
– http://app.mydomain.com/app3

Sin embargo, las aplicaciones en sí no reconocen estas rutas adicionales, por lo que me gustaría eliminar el prefijo de las rutas de acceso para que las aplicaciones no las vean.

Si accedo a http://app.mydomain.com/app2/foo, me gustaría que el contenedor app2 reciba la solicitud http://{container.ip.addr}}/foo

Como reproducción, la siguiente configuración en mi docker-compose.yml de traefik funciona parcialmente:

version: "3"
services:
  traefik:
    image: "traefik:v2.5.4"
    command:
      - --entrypoints.web.address=:80
      - --providers.docker=true
      - --api
      - --api.insecure=true
      - --api.dashboard=true
      - --providers.file.directory=/etc/traefik/dynamic
      - --providers.docker.defaultRule=Host(app.mydomain.com) && PathPrefix(/{{ index .Labels "com.docker.compose.service" }})
    ports:
      - "80:80"
      - "8080:8080"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"

app1:
    image: containous/whoami:v1.3.0
  app2:
    image: containous/whoami:v1.3.0
  app3:
    image: containous/whoami:v1.3.0

Después de agregar 127.0.0.1 app.mydomain.com a /etc/hosts, haciendo una llamada curl a http://app.mydomain.com/app{1,2,3}/foo se enruta correctamente al servicio correspondiente, pero la ruta de la solicitud recibida es /app1/foo, /app2/foo, /app3/foo cuando me gustaría que todas recibieran /foo.

Creo que me gustaría poder agregar lo siguiente a los parámetros de línea de comando en docker-compose:

--providers.docker.middleware.default-stripprefix.stripprefix.prefixes=/{{ index .Labels "com.docker.compose.service" }}

Pero no funciona (error: command traefik error: failed to decode configuration from flags: field not found, node: middleware)

No puedo encontrar ninguna documentación que indique cuáles podrían ser los parámetros de línea de comando correctos.

Creo que podría ser necesario incluirlo en un archivo de configuración dinámico (también lo he visto cuando he estado trabajando con la configuración de TLS, pero quiero mantener todo eso fuera de la reproducibilidad en esta etapa), pero tampoco puedo encontrar cuál sería la configuración correcta para un middleware predeterminado.

Puedo encontrar muchas referencias (y hacerlo funcionar) donde tengo que especificarlo en las etiquetas de cada contenedor, pero preferiría simplemente dejar esto por defecto con entradas únicas en la configuración de traefik en sí.

He estado golpeando mi cabeza contra esto durante 2 días. He intentado buscar en el sitio de documentación, esta comunidad y el universo Google sin suerte. ¡Me parece una configuración “101”! 🙂

Por favor, ¿alguien podría ayudarme no solo a resolver mi problema sino también a enseñarme cómo podría haber encontrado la solución en el sitio de documentación? He visto muchas referencias al buen sitio de documentación, pero me parecen bastante escasas para v2.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Estimado recién llegado a traefik,

    Entiendo tu frustración al no encontrar una solución a tu problema después de buscar en la documentación y en internet. Afortunadamente, creo tener una solución para ti.

    Para lograr lo que has descrito, necesitas agregar un middleware por defecto que elimine el prefijo del camino de la URL. Como mencionaste, esto puede lograrse usando un archivo de configuración dinámica o parámetros de línea de comando.

    Aquí te presento un ejemplo de cómo lograr esto usando parámetros de línea de comando:

    La configuración anterior agrega un middleware stripprefixregex a Traefik usando el parámetro de línea de comando --middlewares. Este middleware elimina el prefijo del camino de la URL utilizando una coincidencia y reemplazo de expresiones regulares. En este caso, la expresión regular coincide con el prefijo /app1, /app2 o /app3, y lo elimina del camino de la solicitud.

    Además, necesitas agregar el middleware a cada router utilizando etiquetas en el contenedor de Docker en sí mismo. Esto se logra agregando traefik.http...middlewares=stripprefixregex a la configuración de cada contenedor.

    Espero que esto te ayude a resolver tu problema. En cuanto a encontrar una solución a este problema en el sitio de documentación, sugiero buscar temas relacionados con middleware, reescritura de URL y enrutamiento. También te puede resultar útil buscar documentación sobre la configuración dinámica y el proveedor de Docker de Traefik. ¡Buena suerte!

Comments are closed.