使用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
指令:
-
创build健康检查脚本,当成功时将
exit 1
:select 1+1 from <table>
或其他select 1+1 from <table>
。 调用这个health.sh
。 -
在您的Dockerfile中,将
health.sh
复制到容器。 - 使用
HEALTHCHECK CMD
运行health.sh
脚本。 -
在你的撰写文件中,修改你的
app
定义:版本:2.1 应用: build立:。 链接: - mysql 依赖于取决于: MySQL的: 条件:service_healthy