Python-Docker容器无法连接到MariaDB-Docker容器

时间:2019-11-03 19:47:52

标签: python docker docker-compose mariadb docker-networking

我正试图获取我的dockerized python脚本,以从也被dockerized的mariadb获取数据。

我知道使用网络或链接应该可行。但是,由于不推荐使用链接(根据the Docker documentation),我宁愿不使用链接。

docker-compose

version: "3.7"

services:

[...]

 mariadb:
   build: ./db
   container_name: maria_db
   expose: 
     - 3306
   environment:
     MYSQL_ROOT_PASSWORD: root
     MYSQL_USER: user
     MYSQL_PASSWORD: user
   restart: always
   networks:
       - logrun_to_mariadb
[...]

 logrun_engine:
   build: ./logrun_engine
   container_name: logrun_engine
   restart: always
   networks:
     - logrun_to_mariadb

networks:
   logrun_to_mariadb:
       external: false
       name: logrun_to_mariadb

logrun_engine容器在启动时执行python脚本:

import mysql.connector as mariadb

class DBConnector:
   def __init__(self, dbname):
       self.mariadb_connection = mariadb.connect(host='mariadb', port='3306', user='root', password='root', database=dbname)
       self.cursor = self.mariadb_connection.cursor()

   def get_Usecases(self):
       self.cursor.execute("SELECT * FROM Test")
       tests = []
       for test in self.cursor:
           print(test) 
       print("Logrun-Engine running...")

test = DBConnector('test_db')
test.get_Usecases()

每当我运行docker-compose up -d时,我的logrun_engine日志中都会充满错误消息:

_mysql_connector.MySQLInterfaceError: Can't connect to MySQL server on 'mariadb' (111)

当我在本地运行python脚本并连接到本地mariadb时,它可以正常工作,因此该脚本应该正确。

我发现的有关此错误消息的大多数答案是人们使用localhost127.0.0.1代替了我已经拥有的docker容器。

我尝试了桥接网络,主机网络,链接等。但是显然我还没有找到正确的东西。

有什么想法如何连接这两个容器?<​​/ p>

2 个答案:

答案 0 :(得分:0)

好的,所以我太急了,在查询数据库之前没有让mysql正确启动,谢谢@DanielFarrel指出这一点。 当我在查询数据库之前在python脚本中添加10秒延迟时,它神奇地起作用了……

答案 1 :(得分:-1)

睡眠也许是一种解决方案。但是,如果db缓慢上升,则可能会出现问题。

作为替代方案,您可以使用agent来确保db连接之前已启动,类似于解决方案here

运行:

docker-compose up -d agent

代理启动后,您确定数据库启动并且您的应用程序可以运行:

docker-compose up -d logrun_engine

该解决方案确实使用了--links,但是可以轻松地对其进行修改以使用docker网络。