使用docker-compose Mysql + App

时间:2015-10-29 16:24:49

标签: mysql docker dockerfile docker-compose

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

MySQL Dockerfile:

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

App 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'上的MySQL服务器   (111)“)

编辑: 我不知道我是否需要等待启动app docker。我想,当应用尝试连接时,MySQL还没有出现。

3 个答案:

答案 0 :(得分:2)

这是一个已知问题,尚未解决。看看这个链接 Docker services need to wait

当你的App容器很快出现时,MySql服务还没有启动你是绝对正确的,因此当它尝试连接到MySql时,连接被拒绝。在应用程序方面,您可以做的是您可以编写一些重试逻辑。这些方面的东西

while(numberOfRetries > 0) {

try {

  // Try to connect to MySql
} catch(Exception e) {

     numberOfRetries--;

     if(numberOfRetries == 0)
       // log the exception 
}

希望这有帮助。

答案 1 :(得分:1)

自Docker 1.13以来,这已成为一个已解决的问题。您现在可以在MySQL Dockerfile中使用HEALTHCHECK指令:

  1. 创建一个运行状况检查脚本,成功时exit 1select 1+1 from <table>或其他内容。请拨打此health.sh

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

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

    version: 2.1
    
    app:
      build: .
      links:
        - mysql
      depends_on:
        mysql:
          condition: service_healthy
    

答案 2 :(得分:0)

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