gpt4 book ai didi

mysql - Django docker 容器无法连接到 mysql 容器,错误为 "Can' t 连接到 'db' (111) 上的 MySQL 服务器"

转载 作者:可可西里 更新时间:2023-11-01 09:02:10 26 4
gpt4 key购买 nike

我正在尝试使用 docker 设置 Django 开发环境。虽然我可以连接到主机上的 mysql。但是 web 容器无法连接到 mysql 容器,出现以下错误:

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'db' (111)")

下面是docker配置和django配置:

------------docker-compose.yml------------

version: '2'
services:
web:
build: .
volumes:
- ".:/code/current"
ports:
- "8000:8000"
depends_on:
- db
- redis
links:
- db
- redis
command: ./manage.py runserver 0.0.0.0:8000

db:
image: mysql:5.7
volumes:
- "./.data/db:/var/lib/mysql"
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=goat_db
restart: always
ports:
- "3306:3306"

重新定义: 重启:总是 图片:redis:最新 端口: - “6379:6379”

--------------网络镜像的Dockerfile--------------------

FROM ubuntu:14.04
MAINTAINER Alice
RUN apt-get update
RUN apt-get install -y tar git curl wget emacs build-essential python python-dev python-distribute python-pip libpcre3 libpcre3-dev libmysqlclient-dev python-m2crypto openssl libssl-dev swig freetds-dev python-pymssql nginx subversion
RUN mkdir -p var/www/goat.garenanow.com/current/log
WORKDIR /var/www/goat.garenanow.com/current
ADD requirements.txt /var/www/goat.garenanow.com/current
RUN pip install -r requirements.txt
ADD . /var/www/goat.garenanow.com/current
EXPOSE 8000

------django数据库配置---

DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'goat_db',
'USER': 'root',
'PASSWORD': 'root',
'HOST': 'db',
'PORT': '3306',
},

最佳答案

如果 Django 尝试连接到你的数据库而 MySql 还没有准备好,那么你可能会看到这个错误:

django.db.utils.OperationalError: (2003, "Can't connect to MySQL server on 'db' (111)")

这种情况的解决方案是在运行 Web 服务器之前等待数据库服务器准备就绪。

我们如何做到这一点?

我们没有直接运行网络服务器,而是创建并运行一个脚本,它将等待数据库服务器准备就绪。之后脚本将运行网络服务器。


docker-compose.yml 文件(相关部分是当我们覆盖 web:command 指令并且我们运行脚本而不是立即运行网络服务器时)。

version: '3'
services:
db:
restart: always
image: mysql:5.7
container_name: my_db
env_file: env_db
ports:
- "3306:3306"

web:
restart: always
build: ./web
env_file: env_web
command: ./wait_for_db_and_start_server.sh
ports:
- "8000:8000"
depends_on:
- db

现在 env_web 文件(相关部分是 START_CMD 变量)。

# Add Environment Variables
DB_NAME=docker
DB_USER=docker_user
DB_PASS=docker_password
DB_SERVICE=db
DB_HOST=db
DB_PORT=3306
START_CMD=python manage.py runserver 0.0.0.0:8000

现在,我们的 web Dockerfile(相关部分是当我们添加 wait_for_db_and_start_server.sh 时)。

FROM python:2.7

ADD wait_for_db_and_start_server.sh .

ADD requirements.txt .
RUN pip install -r requirements.txt

ADD . .

现在 wait_for_db_and_start_server.sh 文件。 (基本上,虽然我们无法连接到指定 $DB_HOST 上的数据库服务器:$DB_PORT 在我们的 env_web 文件中定义,但我们等待 3 秒并再次尝试 M_LOOPS 次。如果我们能够连接到服务器,那么我们将运行在我们的 env_web 文件中定义的 $START_CMD。)

#!/bin/sh
# Wait for database to get available

M_LOOPS="10"

#wait for mysql
i=0
# http://stackoverflow.com/a/19956266/4848859
while ! curl $DB_HOST:$DB_PORT >/dev/null 2>&1 < /dev/null; do
i=`expr $i + 1`

if [ $i -ge $M_LOOPS ]; then
echo "$(date) - ${DB_HOST}:${DB_PORT} still not reachable, giving up"
exit 1
fi

echo "$(date) - waiting for ${DB_HOST}:${DB_PORT}..."
sleep 3
done

echo "$(date) - ${DB_HOST}:${DB_PORT} Reachable ! - Starting Daemon"
#start the daemon
exec $START_CMD

关于mysql - Django docker 容器无法连接到 mysql 容器,错误为 "Can' t 连接到 'db' (111) 上的 MySQL 服务器",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38478949/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com