Невозможно подключиться к изображению mysql, связавшись в docker compose file

-2

Я использую следующий файл для записи докеров

version: '2'
services:
 app_test:
  build:
   context: .
   dockerfile: Dockerfile-jenkins-test
  ports:
   - "7200:7200"
  volumes:
   - .:/opt/project
  environment:
   - DJANGO_SETTINGS_MODULE=myapp.settings.test
   - MYSQL_DATABASE=test_db
   - DB_HOST=mysql_test_db
   - MYSQL_ROOT_PASSWORD=my_pass
   - DB_PORT=3306
  links:
   - mysql_test_db
 mysql_test_db:
  image: mysql:latest
  container_name: mysql_db_container
  expose:
   - "3306"
  environment:
   - MYSQL_ROOT_PASSWORD=mypass
   - MYSQL_DATABASE=test_db

при попытке получить доступ к mysql с помощью DB_HOST mysql_test_db, это приведет к ошибке, говорящей

django.db.utils.OperationalError: (2005, "Неизвестный сервер MySQL MySQL" mysql_test_db "(0)")

Как получить доступ к связанному образцу MySQL db из app_test?

Теги:
docker
docker-compose

1 ответ

2

Вам не нужны "ссылки" такого рода, все сервисы в docker-compose могут достигать себя и автоматически связаны с их именем службы.

Кроме того, нет необходимости выставлять 3306, так как во внутренней докере-сети для этого стека для сборки докеров порт все равно может быть достигнут любой службой внутри сети.

version: '2'
services:
 app_test:
  build:
   context: .
   dockerfile: Dockerfile-jenkins-test
  ports:
   - "7200:7200"
  volumes:
   - .:/opt/project
  environment:
   - DJANGO_SETTINGS_MODULE=myapp.settings.test
   - MYSQL_DATABASE=test_db
   - DB_HOST=mysql_test_db
   - MYSQL_ROOT_PASSWORD=my_pass
   - DB_PORT=3306
 mysql_test_db:
  image: mysql:latest
  container_name: mysql_db_container
  environment:
   - MYSQL_ROOT_PASSWORD=mypass
   - MYSQL_DATABASE=test_db

Но, скорее всего, вы имеете дело с тем, что ht-порядок обслуживания не подходит вам. Mysql понадобится некоторое время, прежде чем БД может быть подключено, и у вас есть учетные данные, в то время как ваше приложение django работает очень быстро и пытается подключиться мгновенно, прежде чем эти учетные данные будут предоставлены.

Вам нужно в своем месте входа в приложение django использовать что-то вроде wait-for-it https://github.com/vishnubob/wait-for-it и проверить, что порт 3306 доступен. В терминах MSQYL это может быть даже ложным, так как это предложение начинается с демона mysqld_safe, не разрешая каких-либо подключений, но сокет TCP открыт и обманет "дождаться".

Итак, что вы можете сделать, это использовать реальное соединение mysql, используя ваши учетные данные, чтобы заблокировать загрузку приложения до тех пор, пока соединение не будет установлено:

#!/bin/bash

RET=1
echo "Waiting for database"
while [[ RET -ne 0 ]]; do
    sleep 1;
    if [ -z "${db_password}" ]; then
        mysql -h $db_host -u $db_user -e "select 1" > /dev/null 2>&1; RET=$?
    else
        mysql -h $db_host -u $db_user -p$db_password -e "select 1" > /dev/null 2>&1; RET=$?
    fi
done
echo "DB reached, continuing"

Таким образом, это происходит прямо перед тем, как вы загрузите свое приложение django.

Это должно помочь - и также должно помочь, какой уровень проблем, несколько уровней, может быть причиной здесь.

  • 0
    к сожалению, я пробую это с помощью трубопровода Jenkins и не могу использовать реальное соединение там
  • 0
    Вам нужно связать, иначе это будет проблематично в средах с несколькими ветвями конвейера.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню