0
votes

Impossible d'accéder à MySQL DB à l'aide de Python (à la fois en cours d'exécution sur différents conteneurs)

J'essaie de vous connecter à MySQL DB à l'aide d'un programme Python. Lorsqu'il fonctionne localement, cela fonctionne.

Mais tout en dockerisant l'application que j'ai créée, un conteneur est destiné au code Python et à l'autre pour le MySQL DB, lorsque je suis de cette manière qu'il ne connecte pas. P>

python_code : P>

version: "3"
  services:
    app:
      image: app:latest
      links:
        - db
      ports:
        - "8001:8081"
      environment:
        - DB_HOST= db

    db:
      image: mysql:5.7.26
      restart: always
      environment:
        MYSQL_DATABASE: 'my_db'
        MYSQL_USER: 'docker_root'
        MYSQL_PASSWORD: 'password'
        MYSQL_ROOT_PASSWORD: 'password'
      ports:
        - "3306:3306"
      volumes:
        - ./DB_config/:/etc/mysql/mysql.conf.d


0 commentaires

3 Réponses :


1
votes

Essayez d'utiliser le port de conteneur 3306 code> - xxx pré>

aussi, ajoutez dépend_on code> attribut, vous pouvez supprimer les liens Code> Attribut - P>

 depends_on:
    - db


3 commentaires

toujours la même erreur. J'ai édité la question - selon cette réponse,


Essayez d'ajouter dépend_on ainsi que puis exécutez la composition à nouveau.


Même ça n'a pas aidé :(



1
votes

Vous pouvez utiliser DEPEND_ON DRAPORT comme mentionné dans la réponse acceptée. Si cela ne résout pas votre problème, ils utilisent cette approche.

Après avoir démarré le conteneur, votre serveur tentera de vous connecter au serveur de base de données. Parfois, le serveur de base de données peut prendre un certain temps pour démarrer et dans cette fenêtre, si le serveur essaie de se connecter au serveur de base de données, il est confronté à des problèmes. Essayez d'ajouter une logique à reconnecter le serveur de base de données après quelques secondes si la connexion échoue. P>

try{
   connectToDatabase();
   }catch(error){
   waitForHalfMinute();
   connectToDatabase();
}


4 commentaires

Est-ce la même logique que nous utilisons tout en faisant dépend_on dans le fichier de composition? @ VivekyAdv4?


Dépend_on fonctionne partiellement, une fois que vous avez démarré la base de données de la base de données, Server commencera. Il ne vérifiera pas si le port est ouvert ou non, c'est-à-dire que la base de données est en réalité ou non. Si votre instance de base de données prend du temps pour démarrer que dépend de la dépendance.


Avons-nous un moyen de gérer cela dans le fichier de composition?


Pas sûr de cela, mais probablement non, car j'ai fait face à ce problème et creusé beaucoup par la documentation Docker pour elle



1
votes

Je vous recommanderais de quitter votre application au cas où il ne peut pas se connecter à MySQL et définir la stratégie de redémarrage pour toujours, car dépend_on code> ne garantit pas que MySQL sera totalement upée lorsque App commence mais il est bon de l'avoir bien.

try:
    db.bind(provider='mysql', user='docker_root', password='password', host='db', database=database, port = 3306)
except:
    # write some logs
    exit(1)


4 commentaires

Pouvez-vous me dire exactement ce qui se passe lorsque nous utilisons dépend?


dépend_on ne attend pas votre cas-- pour dB pour être prêt, il ne garantit que le service dB est démarré avant App mais il ne garantit pas que dB sera prêt. Cochez cette case docs.docker.com/commose/commound-file et vérifier la note qui dit:> "Il y a plusieurs choses à conscience de l'utilisation de Depends_on"


Un exemple serait que le conteneur pour db démarre, puis app démarrera mais dB processus de démarrage peut prendre un certain temps par E.G. 3 secondes, donc app essaiera de se connecter à quelque chose qui commence toujours


Si vous exécutez Docker-compose application , il démarrera également dB , mais c'est à peu près tout ce qu'il fait. Il commencera à démarrer dB avant de démarrer la démarrage mais comme d'autres ont noté que le démarrage MySQL peut prendre un certain temps.