You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 19:44:59