执行Docker迁移命令时出现DB主机名解析失败错误,寻求解决方案
Django迁移时主机名"db"解析失败的解决办法
执行docker-compose exec web python manage.py migrate时触发错误:
django.db.utils.OperationalError: could not translate host name "db" to address: Temporary failure in name resolution
已尝试Stack Overflow常规方案,当前正在按照《Django for Professionals》操作,以下是我的配置文件:
docker-compose.yml
services: web: build: . command: python /code/manage.py runserver 0.0.0.0:8000 volumes: - .:/code ports: - 8000:8000 depends_on: - db db: image: postgres volumes: - postgres_data:/var/lib/postgresql/data/ ports: - 5432:5432 environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres volumes: postgres_data:
Dockerfile
FROM python:3.9.6 # 设置环境变量 ENV PYTHONDONTWRITEBYTECODE 1 ENV PYTHONUNBUFFERED 1 # 设置工作目录 WORKDIR /code # 安装依赖 COPY Pipfile Pipfile.lock /code/ RUN pip install pipenv && pipenv install --system # 复制项目文件 COPY . /code/
settings.py
DATABASES = { 'default': { 'ENGINE': 'django.db.backends.postgresql', 'NAME': 'postgres', 'USER': 'postgres', 'PASSWORD': 'postgres', 'HOST': 'db', 'PORT': 5432 } }
可行排查/解决步骤
- 确认DB容器状态:执行
docker-compose ps查看db服务是否正常启动,若未启动,先运行docker-compose up -d db,等待数据库初始化完成(看日志出现database system is ready to accept connections)再启动web服务。 - 重置Docker网络:执行
docker-compose down,重启本地Docker服务后,再重新启动容器docker-compose up -d,清除DNS缓存问题。 - 显式定义自定义网络:在docker-compose.yml中添加自定义网络,确保web和db处于同一网络环境:
services: web: # 保留原有配置 networks: - app-network db: # 保留原有配置 networks: - app-network volumes: postgres_data: networks: app-network: driver: bridge - 临时替换为容器IP:通过
docker inspect <db容器ID>获取db容器的IP地址,将settings.py中的HOST改为该IP,执行migrate测试是否成功,以此确认是否为DNS解析问题。
内容的提问来源于stack exchange,提问作者Aman Choudhary
相关产品推荐
相关产品推荐

