Knowledge Base

¿Qué es esto?

Docker: Debug de arranque de containers con docker compose

23/08/2018 - 27/12/2018 -  Comentarios - Docker Comandos Docker compose

Si después de ejecutar la instrucción para arrancar contenedores con docker compose (habitualmente docker-compose up), vemos que hay alguno que no se ha arrancado podemos seguir los pasos siguientes para encontrar el error:

1) Miramos qué contenedores se han arrancado con docker compose ejecutando:

sudo docker-compose ps

Nos mostrará una salida similar a la siguiente:

     Name                   Command               State                                    Ports                                

---------------------------------------------------------------------------------------------------------------------------------

frappe           /bin/bash                        Up       0.0.0.0:6787->6787/tcp, 0.0.0.0:8000->8000/tcp, 0.0.0.0:9000->9000/tcp

mariadb          docker-entrypoint.sh mysqld      Exit 1                                                                        

redis-cache      docker-entrypoint.sh redis ...   Up       6379/tcp                                                             

redis-queue      docker-entrypoint.sh redis ...   Up       6379/tcp                                                             

redis-socketio   docker-entrypoint.sh redis ...   Up       6379/tcp       

En status podremos ver si alguno no se ha arrancado, en el caso anterior, vemos que el contenedor mariadb no se ha arrancado.

2) Vemos la razón por la que no se ha arrancado ejecutando:

docker-compose logs —follow containerName

En mi caso sería:

docker-compose logs —follow mariadb

Nos mostrará una salida como la siguiente dándonos más información:

Traceback (most recent call last):

  File "/usr/bin/docker-compose", line 11, in <module>

    load_entry_point('docker-compose==1.17.1', 'console_scripts', 'docker-compose')()

  File "/usr/lib/python2.7/dist-packages/compose/cli/main.py", line 68, in main

    command()

  File "/usr/lib/python2.7/dist-packages/compose/cli/main.py", line 121, in perform_command

    handler(command, command_options)

  File "/usr/lib/python2.7/dist-packages/compose/cli/main.py", line 556, in logs

    containers = self.project.containers(service_names=options['SERVICE'], stopped=True)

  File "/usr/lib/python2.7/dist-packages/compose/project.py", line 530, in containers

    self.validate_service_names(service_names)

  File "/usr/lib/python2.7/dist-packages/compose/project.py", line 157, in validate_service_names

    raise NoSuchService(name)

  File "/usr/lib/python2.7/dist-packages/compose/project.py", line 666, in __init__

    self.msg = "No such service: %s" % self.name

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 0: ordinal not in range(128)

Si con esto no tenemos suficiente. Podemos hacer los siguientes pasos:

1) Abrimos el fichero docker-compose.yml y para el servicio que queramos debugar, añadimos esta línea:

entrypoint: ["sh", "-c", "sleep 2073600"]

Suponiendo por ejemplo un servicio mariadb, quedaría de la siguiente manera:

version: '2'

services:

  mariadb:

    image: "mariadb:10.2"

    environment:

      - MYSQL_ROOT_PASSWORD=123

      - MYSQL_USER=root

    volumes:

      - ./conf/mariadb-conf.d:/etc/mysql/conf.d

    ports:

      - "3307:3306" #mariadb-port

    container_name: mariadb

    entrypoint: ["sh", "-c", "sleep 2073600"]

Volvemos a ejecutar el docker-compose up. Ahora gracias a esa línea que hemos añadido, evitaremos que el sistema falle, y podremos acceder al contenedor:

docker-compose exec mariadb bash

Una vez dentro podemos probar a arrancar manualmente todos los servicios, de manera que podremos ver qué error es el causante de que no arrancara antes el contenedor.

Una vez resuelto ya podemos quitar la línea del docker compose.