Использование docker-compose Mysql + App
Я пытаюсь связать два контейнера с помощью докера.
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, "Не удается подключиться к серверу MySQL на" rds "(111)")
РЕДАКТИРОВАТЬ: я не знаю, если мне нужно немного подождать, чтобы запустить докер приложения. Я предполагаю, что MySQL не работает, когда приложение пытается подключиться.
3 ответа
Это известная проблема, и она еще не решена. Проверьте эту ссылку 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, это теперь решенная проблема. Теперь вы можете использовать HEALTHCHECK
директива в вашем MySQL Dockerfile:
Создайте скрипт проверки работоспособности, который будет
exit 1
когда успех:select 1+1 from <table>
или что-то. Позвониhealth.sh
,В вашем Dockerfile скопируйте
health.sh
в контейнер.- Использовать
HEALTHCHECK CMD
запуститьhealth.sh
скрипт. В вашем файле композиции измените
app
определение:версия: 2.1 приложение: сборка:. ссылки: - mysql зависит_он: mysql: условие: service_healthy
Я думаю, что вы правы, что вам нужно подождать. Вы можете попытаться установить соединение в цикле и повторить попытку несколько раз с коротким сном между каждой попыткой.