我正在尝试使用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还没有出现。
答案 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
指令:
创建一个运行状况检查脚本,成功时exit 1
:select 1+1 from <table>
或其他内容。请拨打此health.sh
。
在Dockerfile中,将health.sh
复制到容器中。
HEALTHCHECK CMD
运行health.sh
脚本。在撰写文件中,修改app
定义:
version: 2.1 app: build: . links: - mysql depends_on: mysql: condition: service_healthy
答案 2 :(得分:0)
我认为你是对的,你需要等待。您可以在循环中尝试连接,并在每次尝试之间以短暂睡眠重试几次。