aquí está mi archivo docker-compose.yml
services: db: image: mysql ports: - '3306:3306' environment: MYSQL_DATABASE: 'app' MYSQL_USER: 'root' MYSQL_PASSWORD: 'aspilos' MYSQL_ROOT_PASSWORD: 'aspilos' web: build: . command: python manage.py runserver 0.0.0.0:8000 volumes: - .:/aspilos ports: - "8000:8000" depends_on: - dbAquí está mi archivo utils.py
import mysql.connector mydb = mysql.connector.connect( host="db", user="root", passwd="aspilos", database="aspilos_log", auth_plugin="mysql_native_password" ) mycursor = mydb.cursor() mycursor.execute("SELECT CONCAT('+', PHONE_NUMBER) FROM category2") results = mycursor.fetchall() for i in zip(*results): number = list(i) number1 = '+2348076548894' print (number)Aquí está mi archivo settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'app', 'USER': 'root', 'PASSWORD': 'aspilos', 'HOST': 'db', 'PORT': '3306', }, }"docker-compose up" todo funciona bien y se abre localmente Pero cuando ejecuto
"python manage.py runserver"aparece un errormysql.connector.errors.DatabaseError: 2005 (HY000): Unknown MySQL server host 'db' (2)
Database Host DB solo funcionará en la red docker-compose . Puede conectarse a otro servicio usando el nombre del servicio dentro de docker-compose pero deja de ser válido fuera de la red docker.
Un error común que puede ocurrir en docker-compose es cuando la base de datos aún no está lista pero la aplicación intenta conectarse, una solución rápida y sucia para eso puede ser
webapp: build: . image: webapp command: sh -c "sleep 30s ; python /app/manage.py"Pero debe implementar la lógica de reintento.
Para lidiar con el error anterior, necesita un DNS que el host o el sistema puedan resolver
mydb = mysql.connector.connect( host="REACHABLE_IP", .... )Puede verificar la IP accesible conectándose a través de la base de datos, puede
MySQL -h REACHABLE_IP -u db_user -pPass