Docker Compose部署Django+PostgreSQL创建超级用户遇域名解析错误
Django + Docker Compose 创建超级用户时出现数据库域名解析错误
我用Docker Compose搭建了Django+PostgreSQL的容器化系统,Django页面能正常访问,但执行python3 manage.py createsuperuser时,报错:django.db.utils.OperationalError: could not translate host name "db" to address: Temporary failure in name resolution
docker-compose.yml 配置
version: "3.9" services: db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres networks: - mynetwork web: build: . command: bash -c "sleep 10 && python manage.py migrate && python manage.py runserver 0.0.0.0:8000" volumes: - .:/code ports: - "8000:8000" environment: - POSTGRES_NAME=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - DB_HOST=db # Définir DB_HOST pour correspondre au nom du service db dans docker-compose.yml depends_on: - db networks: - mynetwork networks: mynetwork: driver: bridge
Dockerfile 配置
# syntax=docker/dockerfile:1 FROM python:3 ENV PYTHONUNBUFFERED=1 WORKDIR /code COPY requirements.txt /code/ RUN pip install -r requirements.txt COPY . /code/
settings.py 数据库配置
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('POSTGRES_NAME'), 'USER': os.environ.get('POSTGRES_USER'), 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), 'HOST': 'dbdo', 'PORT': 5432, #default port you don't need to mention in docker-compose } }
完整错误栈
(base) apprenant@apprenant-HP-ZBook-15-G3:~/Documents/DevIA/Projet_DevIA/Test/project_docker/projet$ python3 manage.py createsuperuser Traceback (most recent call last): File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 282, in ensure_connection self.connect() File "/home/apprenant/.local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 263, in connect self.connection = self.get_new_connection(conn_params) File "/home/apprenant/.local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 215, in get_new_connection connection = Database.connect(**conn_params) File "/home/apprenant/miniconda3/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) psycopg2.OperationalError: could not translate host name "db" to address: Temporary failure in name resolution The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/home/apprenant/Documents/DevIA/Projet_DevIA/Test/project_docker/projet/manage.py", line 22, in <module> main() File "/home/apprenant/Documents/DevIA/Projet_DevIA/Test/project_docker/projet/manage.py", line 18, in main execute_from_command_line(sys.argv) File "/home/apprenant/.local/lib/python3.10/site-packages/django/core/management/__init__.py", line 446, in execute_from_command_line utility.execute() File "/home/apprenant/.local/lib/python3.10/site-packages/django/core/management/__init__.py", line 440, in execute self.fetch_command(subcommand).run_from_argv(self.argv) File "/home/apprenant/.local/lib/python3.10/site-packages/django/core/management/base.py", line 402, in run_from_argv self.execute(*args, **cmd_options) File "/home/apprenant/.local/lib/python3.10/site-packages/django/contrib/auth/management/commands/createsuperuser.py", line 88, in execute return super().execute(*args, **options) File "/home/apprenant/.local/lib/python3.10/site-packages/django/core/management/base.py", line 447, in execute self.check_migrations() File "/home/apprenant/.local/lib/python3.10/site-packages/django/core/management/base.py", line 564, in check_migrations executor = MigrationExecutor(connections[DEFAULT_DB_ALIAS]) File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/migrations/executor.py", line 18, in __init__ self.loader = MigrationLoader(self.connection) File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 58, in __init__ self.build_graph() File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/migrations/loader.py", line 235, in build_graph self.applied_migrations = recorder.applied_migrations() File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 81, in applied_migrations if self.has_table(): File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/migrations/recorder.py", line 57, in has_table with self.connection.cursor() as cursor: File "/home/apprenant/.local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 323, in cursor return self._cursor() File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 299, in _cursor self.ensure_connection() File "/home/apprenant/.local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 281, in ensure_connection with self.wrap_database_errors: File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/utils.py", line 91, in __exit__ raise dj_exc_value.with_traceback(traceback) from exc_value File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 282, in ensure_connection self.connect() File "/home/apprenant/.local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/backends/base/base.py", line 263, in connect self.connection = self.get_new_connection(conn_params) File "/home/apprenant/.local/lib/python3.10/site-packages/django/utils/asyncio.py", line 26, in inner return func(*args, **kwargs) File "/home/apprenant/.local/lib/python3.10/site-packages/django/db/backends/postgresql/base.py", line 215, in get_new_connection connection = Database.connect(**conn_params) File "/home/apprenant/miniconda3/lib/python3.10/site-packages/psycopg2/__init__.py", line 122, in connect conn = _connect(dsn, connection_factory=connection_factory, **kwasync) django.db.utils.OperationalError: could not translate host name "db" to address: Temporary failure in name resolution
已尝试的解决方法
- 执行
docker system prune清理Docker资源 - 使用BleachBit清理磁盘空间(当前剩余9.5GB)
解决方案
1. 修正settings.py中的数据库HOST笔误
观察settings.py发现数据库HOST写的是'dbdo',这是明显的拼写错误,需改为'db'(对应docker-compose.yml中db服务的名称):
import os DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': os.environ.get('POSTGRES_NAME'), 'USER': os.environ.get('POSTGRES_USER'), 'PASSWORD': os.environ.get('POSTGRES_PASSWORD'), 'HOST': 'db', # 修正此处的笔误 'PORT': 5432, } }
2. 正确执行createsuperuser命令
直接在宿主机执行python3 manage.py createsuperuser时,使用的是宿主机的Python环境,无法解析Docker网络内的db主机名。正确操作是进入web容器内部执行命令:
# 查看web容器名称(通常格式为「项目目录名_web_1」) docker ps # 进入容器 docker exec -it <web容器名称> bash # 在容器内执行创建超级用户命令 python manage.py createsuperuser
3. 可选:优化容器启动顺序(替代sleep硬编码)
当前用sleep 10等待数据库启动的方式不够可靠,可通过健康检查让web服务等待数据库就绪后再启动:
修改docker-compose.yml中的db服务,添加健康检查:
db: image: postgres volumes: - ./data/db:/var/lib/postgresql/data environment: - POSTGRES_DB=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres networks: - mynetwork healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres"] interval: 5s timeout: 5s retries: 5
再修改web服务的depends_on配置,依赖db服务的健康状态:
web: build: . command: bash -c "python manage.py migrate && python manage.py runserver 0.0.0.0:8000" volumes: - .:/code ports: - "8000:8000" environment: - POSTGRES_NAME=postgres - POSTGRES_USER=postgres - POSTGRES_PASSWORD=postgres - DB_HOST=db depends_on: db: condition: service_healthy networks: - mynetwork
内容的提问来源于stack exchange,提问作者Myriam LE BIHAN
相关产品推荐
相关产品推荐

