Я использую следующий файл для записи докеров
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-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.
Это должно помочь - и также должно помочь, какой уровень проблем, несколько уровней, может быть причиной здесь.