【问题标题】:Using docker-compose Mysql + App使用 docker-compose Mysql + App
【发布时间】:2015-10-29 16:24:48
【问题描述】:

我正在尝试使用 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, "Can't connect to MySQL server on 'rds' (111)")

编辑: 我不知道我是否需要稍等片刻才能启动应用程序 docker。我想当应用程序尝试连接时 MySQL 没有启动。

【问题讨论】:

  • 我猜mysql的主机是'mysql'而不是'rds',不是吗?
  • 你是对的。这是我的错误。但这不是核心问题。
  • 在下面查看我的答案

标签: mysql docker dockerfile docker-compose


【解决方案1】:

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

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

while(numberOfRetries > 0) {

try {

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

     numberOfRetries--;

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

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    从 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 定义:

      版本:2.1 应用程序: 建造: 。 链接: - mysql 取决于: mysql: 条件:service_healthy

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 在下面查看我的答案
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-20
      • 1970-01-01
      • 2017-06-27
      相关资源
      最近更新 更多