Docker部署Django执行createsuperuser报错:Unknown server host 'db'
Django容器内数据库连接正常,但本地执行manage.py命令报错无法解析'db'主机
Docker搭配Pipenv部署Django应用,执行docker compose up -d --build后,容器内的应用能正常连接db服务的数据库,settings.py已配置数据库HOST为'db'。但在本地环境执行python manage.py createsuperuser等manage.py命令时,持续报错:
django.db.utils.OperationalError: (2005, "Unknown server host 'db' (11001)")
错误详情
PS C:\Users\nawar\Desktop\uni\Uni\Modules\UWE_Modules\Y3\DESD\CW2\mlaas-g7> python manage.py createsuperuser Traceback (most recent call last): File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 282, in ensure_connection self.connect() File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 263, in connect self.connection = self.get_new_connection(conn_params) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\mysql\base.py", line 247, in get_new_connection connection = Database.connect(**conn_params) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\MySQLdb\__init__.py", line 123, in Connect return Connection(*args, **kwargs) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\MySQLdb\connections.py", line 185, in __init__ super().__init__(*args, **kwargs2) MySQLdb._exceptions.OperationalError: (2005, "Unknown server host 'db' (11001)") The above exception was the direct cause of the following exception: Traceback (most recent call last): File "C:\Users\nawar\Desktop\uni\Uni\Modules\UWE_Modules\Y3\DESD\CW2\mlaas-g7\manage.py", line 22, in <module> main() File "C:\Users\nawar\Desktop\uni\Uni\Modules\UWE_Modules\Y3\DESD\CW2\mlaas-g7\manage.py", line 18, in main execute_from_command_line(sys.argv) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\__init__.py", line 446, in execute_from_command_line utility.execute() File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\__init__.py", line 440, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\base.py", line 402, in run_from_argv self.execute(*args, **cmd_options) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\contrib\auth\management\commands\createsuperuser.py", line 88, in execute return super().execute(*args, **options) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\base.py", line 447, in execute self.check_migrations() File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\core\management\base.py", line 564, in check_migrations executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS]) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\executor.py", line 18, in __init__ self.loader = MigrationLoader(self.connection) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\loader.py", line 58, in __init__ self.build_graph() File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\loader.py", line 235, in build_graph self.applied_migrations = recorder.applied_migrations() File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\recorder.py", line 81, in applied_migrations if self.has_table(): File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\migrations\recorder.py", line 57, in has_table with self.connection.cursor() as cursor: File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 323, in cursor return self._cursor() File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 299, in _cursor self.ensure_connection() File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 281, in ensure_connection with self.wrap_database_errors: File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\utils.py", line 91, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 282, in ensure_connection self.connect() File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\base\base.py", line 263, in connect self.connection = self.get_new_connection(conn_params) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\utils\asyncio.py", line 26, in inner return func(*args, **kwargs) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\django\db\backends\mysql\base.py", line 247, in get_new_connection connection = Database.connect(**conn_params) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\MySQLdb\__init__.py", line 123, in Connect return Connection(*args, **kwargs) File "C:\Users\nawar\.virtualenvs\mlaas-g7-hyj7l3ZN\lib\site-packages\MySQLdb\connections.py", line 185, in __init__ super().__init__(*args, **kwargs2) django.db.utils.OperationalError: (2005, "Unknown server host 'db' (11001)")
相关配置文件
docker-compose.yml
services: mlaas: image: mlaas build: context: . dockerfile: Dockerfile restart: always ports: - "8000:8000" volumes: - .:/app depends_on: - db entrypoint: ["./mlaas-entrypoint.sh"] db: image: mysql:8.0-debian ports: - "3306:3306" environment: MYSQL_ROOT_PASSWORD: mysql-root MYSQL_USER: user MYSQL_PASSWORD: password MYSQL_DATABASE: prediction_db restart: always volumes: - db_data:/var/lib/mysql volumes: db_data:
Dockerfile
FROM python:3.10-slim WORKDIR /app RUN apt-get update && apt-get install -y build-essential default-libmysqlclient-dev COPY requirements.txt ./ RUN pip install -r requirements.txt COPY . . EXPOSE 8000
入口脚本 mlaas-entrypoint.sh
#!/bin/sh echo "Waiting for MySQL Database Service to start..." ./wait-for db:3306 python manage.py makemigrations python manage.py migrate python manage.py runserver 0.0.0.0:8000
问题原因
'db'是Docker Compose创建的内部网络别名,仅在Docker容器所在的内部网络中可解析。本地环境不在该网络范围内,因此无法识别此主机名。
解决方法
方法一:直接在容器内执行命令
通过Docker命令进入运行中的Django容器,在容器内部执行manage.py命令:
# 查看运行中的容器信息,获取Django容器名称或ID docker ps # 进入容器(替换<container_name_or_id>为实际容器名/ID) docker exec -it <container_name_or_id> bash # 在容器内执行命令 python manage.py createsuperuser
方法二:映射本地hosts并区分环境配置
- 修改本地hosts文件:将'db'映射到localhost(因为db服务已将3306端口映射到本地)
- Windows:编辑
C:\Windows\System32\drivers\etc\hosts,添加一行:127.0.0.1 db - Linux/macOS:编辑
/etc/hosts,添加同样内容
- Windows:编辑
- 修改settings.py支持环境变量:通过环境变量区分容器和本地环境的数据库HOST
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': os.getenv('DB_NAME', 'prediction_db'), 'USER': os.getenv('DB_USER', 'user'), 'PASSWORD': os.getenv('DB_PASSWORD', 'password'), 'HOST': os.getenv('DB_HOST', 'db'), # 容器内默认用db,本地可设为localhost 'PORT': os.getenv('DB_PORT', '3306'), } } - 本地执行命令前设置环境变量:
- Windows PowerShell:
$env:DB_HOST="localhost" - Linux/macOS:
export DB_HOST=localhost
之后再执行python manage.py createsuperuser即可。
- Windows PowerShell:
方法三:用docker compose exec直接执行命令
无需进入容器,直接通过docker compose exec在容器上下文执行命令:
docker compose exec mlaas python manage.py createsuperuser
内容的提问来源于stack exchange,提问作者tetra
相关产品推荐
相关产品推荐

