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.