使用docker-compose Mysql + App

我正在尝试使用docker链接两个容器。

MySQL Dockerfile:

... EXPOSE 3306 CMD ["/usr/sbin/mysqld"] 

应用程序Dockerfile:

 ... ADD . /services CMD ["python", "-u", "services/run_tests.py"] 

在我使用的run_tests.py

 self.db = MySQLdb.connect(host="mysql", user="XYZ", passwd="XYZ", db="TEST_DB") 

在我的docker-compose.yml中:

 app: build: . links: - mysql mysql: image: XYZ/KJM 

当我运行docker-compose up我无法连接到MySQL容器。

OperationalError:(2003,“无法连接到'rds'(111)”上的MySQL服务器)

编辑:我不知道如果我需要等待一点,启动应用程序泊坞窗。 我想象的是,当应用程序尝试连接时,MySQL并不是。

这是一个已知的问题,尚未解决。 看看这个链接Docker服务需要等待

当你的应用程序容器非常快速地出现,并且因此当它试图连接到MySql时,连接被拒绝,你绝对正确的是MySql服务还没有启动。 在应用程序方面,你可以做的是你可以写一些重试逻辑。 这些线上的东西

 while(numberOfRetries > 0) { try { // Try to connect to MySql } catch(Exception e) { numberOfRetries--; if(numberOfRetries == 0) // log the exception } 

希望这可以帮助。

我认为你是对的,你需要等待。 您可以在循环中尝试连接,并在每次尝试之间用短暂的睡眠重试几次。

自从Docker 1.13以来,这个问题已经解决了。 您现在可以在MySQL Dockerfile中使用HEALTHCHECK指令:

  1. 创build健康检查脚本,当成功时将exit 1select 1+1 from <table>或其他select 1+1 from <table> 。 调用这个health.sh

  2. 在您的Dockerfile中,将health.sh复制到容器。

  3. 使用HEALTHCHECK CMD运行health.sh脚本。
  4. 在你的撰写文件中,修改你的app定义:

    版本:2.1
    
    应用:
      build立:。
      链接:
         -  mysql
      依赖于取决于:
         MySQL的:
          条件:service_healthy