Использование приложения Mysql + для создания докеров

Я пытаюсь связать два контейнера с помощью докера.

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, «Не удается подключиться к серверу MySQL на 'rds' (111)»)

РЕДАКТИРОВАТЬ: я не знаю, нужно ли мне немного подождать, чтобы запустить докер приложения. Я полагаю, что MySQL не работает, когда приложение пытается подключиться.


person p.magalhaes    schedule 29.10.2015    source источник
comment
я предполагаю, что хост для mysql - это mysql вместо rds, нет?   -  person ivoba    schedule 30.10.2015
comment
Ты прав. Это была моя ошибка. Но это не основная проблема.   -  person p.magalhaes    schedule 30.10.2015
comment
Мой ответ ниже   -  person Daniel van Flymen    schedule 26.05.2017


Ответы (3)


Это известная проблема, и ее еще предстоит решить. Перейдите по этой ссылке. Службы Docker нужно подождать

Вы абсолютно правы в том, что служба MySql еще не запущена, в то время как ваш контейнер приложения появляется очень быстро и, следовательно, когда он пытается подключиться к MySql, в соединении отказывается. Со стороны приложения вы можете написать некоторую логику повтора. Что-то в этих строках

while(numberOfRetries > 0) {

try {

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

     numberOfRetries--;

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

Надеюсь это поможет.

person Sachin Malhotra    schedule 31.10.2015

Начиная с Docker 1.13, эта проблема решена. Теперь вы можете использовать директиву HEALTHCHECK в вашем MySQL Dockerfile:

  1. Создайте сценарий проверки работоспособности, который exit 1 в случае успеха: select 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
    
person Daniel van Flymen    schedule 26.05.2017

Думаю, ты прав, что нужно подождать. Вы можете попытаться установить соединение в цикле и повторить попытку несколько раз с коротким засыпанием между каждой попыткой.

person dnephin    schedule 29.10.2015
comment
Мой ответ ниже - person Daniel van Flymen; 26.05.2017