Ok, primer post en este blog, tal vez debería ser un poco mas formal, pero lo cierto es que acabo de pasar un par de días lamentando y reconsiderando mis elecciones de vida (mas que todo en el aspecto profesional), y todo es culpa de Docker... Esta bien, obviamente no es culpa de esta increíble herramienta, pero como dije, han sido unas horribles 48 horas y no pretendo asumir toda la culpa.

Bien, ya me desahogue, a lo que vinimos.

Primero que todo, entremos en contexto:

Django para el back-end de la app, Docker para la contenerización (si, es una palabra de verdad, la busque, dejen de criticar) de la aplicación, docker-compose y docker-machine se podría decir que son herramientas que hacen el trabajo con Docker mucho, mucho, increíblemente, mucho mas fácil, pero no son realmente el punto del post asi que no voy a entrar en detalles en el funcionamiento de las mismas y django-cookiecutter es una maravilla de la naturaleza enviada por la deidad de su preferencia, para hacernos a nosotros, las personas que trabajamos con Django, la vida mucho mas fácil.

Ahora bien, esta app esta alojada en DigitalOcean, para hacer el "deployment" mas fácil y rápido, seguí esta guiá de realpython.com, y todo iba bien, si leen la guiá se darán cuenta que al final se encontraran desplegando una instancia de la aplicación en un "droplet" de DigitalOcean, es elegante, es hermoso, es casi perfecto, hasta que un día decidí que no quería hacer "deployment" a DigitalOcean, simplemente quería levantar la app en mi computadora personal, es decir, de manera local, y aquí empezaron los problemas.

Al correr docker-compose -f local.yml --build recibía el siguiente error:

docker.errors.DockerException: Credentials store error: StoreError('Credentials store docker-credential-pass exited with "exit status 2: gpg: AVISO: propiedad insegura del directorio personal \''\ngpg: descifrado fallido: No tenemos la clave secreta".')
[10841] Failed to execute script docker-compose
mensaje de error

Obviamente, el siguiente paso fue recurrir a Google (bueno, mi primera reacción fue preguntarme por que demonios no fui bombero o pescador, pero eso no viene al caso), tras, no lo se, 38 horas de investigación y probar soluciones que corrompían mi entorno de desarrollo y reparar el desastre que hacían esas "soluciones", encontré lo mas parecido a la solución, mi archivo ~/.docker/config.json, tenia esta forma o contenido:

{
  "auths": {
  "https://index.docker.io/v1/": {}
  },
  "HttpHeaders": {
    "User-Agent": "Docker-Client/19.03.5 (linux)"
  },
  "credsStore": "pass"
}

Luego de dejar "vació" credsStore:

{
  "auths": {
  "https://index.docker.io/v1/": {}
  },
  "HttpHeaders": {
    "User-Agent": "Docker-Client/19.03.5 (linux)"
  },
  "credsStore": ""
}

El comando corrió sin problemas, y debería estar feliz, la fuerza recobro su balance, pero la verdad es que me molesta no entender, que ocasiono el problema y por que esta solución funciono, y las otras 9999 no, así que me volqué de nuevo a investigar, empece por credsStore, quería saber que era, para que servia, con que se comía, por que había hecho mi vida tan miserable los últimos dos días?, resulta que credsStore hace referencia al software que administra o guarda las credenciales usadas durante el login al registro de Docker, es decir, cuando ejecutamos el comando docker login, lo cual me llevo a otras interrogantes:

Por que tenemos que ejecutar docker login?, Por que se levanta este error cuando corremos docker-compose -f local.yml up --build? y Que tienen que ver docker login y el contenido de config.json con el funcionamiento de docker-compose?

Ahora bien, las respuestas de estas tres preguntas son prácticamente la misma y tiene que ver, en gran parte, con el flujo de Docker, con la forma en la que trabaja.

Resulta, que la gran, enorme, mayoría de las imágenes que usamos a la hora de desarrollar están "hosteadas" en Docker Hub, que según ellos, (su eslogan, creo), es la forma mas fácil de crear, manejar y compartir entre los equipos de trabajo los contenedores de las aplicaciones, (esto fue una traducción bastante básica/cruda), Docker Hub es un repositorio o registro para las imágenes de nuestras aplicaciones, no voy a entrar en mas detalles al respecto por que no es el objetivo de este articulo.

Pero me estoy desviando, el asunto es que al correr el comando docker-compose -f local.yml up --build nos estamos conectando con Docker Hub para obtener las imágenes de los servicios que hemos definido en local.yml, por supuesto, este no siempre es el caso, todo depende de como hayamos escrito nuestro archivo local.yml que por cierto no tiene que llamarse de esa manera.

Por supuesto, para conectarnos a Docker Hub, el servicio necesita identificarnos de alguna manera, lo cierto es que mientras escribo este articulo, creo recordar que hace un par de a*os, cuando instale Docker por primera vez, ejecute docker login y realice todo el proceso por primera vez, y no lo volví a realizar hasta que encontré el error del cual les estoy hablando.

Una de las conclusiones arrojadas por mi investigación en el asunto, fue que para evitar pasar por el proceso de login una y otra vez, la información pertinente es guardada en el archivo antes mencionado, config.json.

El error, protagonista de nuestra historia, hace referencia, en parte y de forma resumida, a que no encuentra las credenciales de autenticacion, acto seguido, no se puede conectar a Docker Hub para descargar las imágenes a utilizar en los servicios que definimos en local.yml, lo que nos lleva a la raíz del problema, a lo que debió ser nuestra principal y única interrogante.

Por que las credenciales ya no están en config.json?

Como dije en alguno de los tantos párrafos anteriores, el problema comenzó después de seguir la guiá de realpython.com , la cual, y esto no lo puedo acentuar lo suficiente, es una excelente guiá, de esperar de la gente de RealPython, lo que nos llega a preguntarnos, por que esta súper increíble guiá desencadeno esta serie de sucesos desafortunado?.

Bueno la guiá no desencadeno nada, es una guiá, y nadie me obligo o nos esta obligando a seguirla, y esto es algo que me ha tocado aprender por las malas en esta profesión, nada sucede por que si, todo tiene lógica, una explicación. Pero lo cierto es que en la guiá nos indican utilizar una herramienta llamada docker-machine, todo indica que esta herramienta modifico el archivo config.json para utilizar un credsStore especifico, lo cual me pareció muy raro por que no recuerdo haber especificado ningún valor para esta configuración.

Y aquí viene lo bueno, damas y caballeros, luego de borrar el valor para credsStore dentro de config.json pude sin problemas correr el comando docker-compose -f local.yml up --build de igual forma, pude correr el comando correspondiente a docker-machine, que no voy a especificar por que no es relevante, pero que debería haber requerido el valor eliminado de credsStore , estaré respondiendo estas interrogantes en la próxima entrega de esta serie.