【问题标题】:Trying to connect Docker + Django to Postgres - could not translate host name "db" to address: Name or service not know尝试将 Docker + Django 连接到 Postgres - 无法将主机名“db”转换为地址:名称或服务不知道
【发布时间】:2022-01-03 04:49:46
【问题描述】:

我正在尝试按照本教程对 Django + Postgres 项目进行 Docker 化:https://docs.docker.com/samples/django/

当我运行docker-compose up 时,我得到:

django.db.utils.OperationalError: could not translate host name "db" to address: Name or service not known

Dockerfile

# syntax=docker/dockerfile:1
FROM python:3
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED=1
WORKDIR /code
COPY requirements.txt /code/
RUN pip install -r requirements.txt
COPY . /code/

docker-compose.yml

version: "3.9"
   
services:
  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
  web:
    build: .
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    environment:
      - POSTGRES_NAME=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    depends_on:
      - db

settings.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': config('DB_NAME'),
        'USER': config('DB_USER'),
        'PASSWORD': config('DB_PASSWORD'),
        'HOST': config('DB_HOST'),
        'PORT': 5432,
    }
}

【问题讨论】:

  • 我们可以通过几种方式来调试这个问题,我并不是说这是一个解决方案,只是为了调试它,你可以用command: sleep 30 && python manage.py runserver 0.0.0.0:8000替换command: python manage.py runserver 0.0.0.0:8000。 Postgres 需要几秒钟才能启动,所以这应该确认这不是问题。并且,使用docker exec -it [container id] bash进入容器,看看是否可以连接到运行在db上的数据库,可以使用psql命令行工具。

标签: django docker docker-compose


【解决方案1】:

很可能您的 Postgres 容器没有启动和崩溃,因为您没有指定默认密码。根据文档 - https://hub.docker.com/_/postgres

PostgreSQL 镜像使用了几个容易被忽略的环境变量。唯一需要的变量是 POSTGRES_PASSWORD,其余的都是可选的。

要检查这一点,请运行 docker ps 并查看 postgres 容器是否正在运行,如果没有,请检查 docker container logs [Container id] 的日志

我建议您也应该添加其他变量,因为没有它,您的 Django 应用程序将无法工作。您还需要添加POSTGRES_DBPOSTGRES_USER

更新db服务如下


  db:
    image: postgres
    volumes:
      - ./data/db:/var/lib/postgresql/data
    environment:
      POSTGRES_PASSWORD: 
      POSTGRES_USER:
      POSTGRES_DB: 

确保这些与 Django 配置中的相同。

在此之后,您的方法仍然存在一些问题。

  1. 在 django 中发送正确的配置。您已经在配置中设置了主机,您还需要在其中添加正确的用户名和密码。

  2. 使用表初始化数据库,并在需要时填充数据。由于您使用的是卷,您可以简单地启动容器,在本地连接到数据库(记得添加端口映射 - https://docs.docker.com/compose/compose-file/compose-file-v3/#ports)并在本地执行 SQL 命令。然后杀死容器并重新启动它们。但是,有更好的方法。这是一个解决您的问题的问题 - Docker initialize database tables and records in SQL Server。这是一个流行的问题,通过谷歌搜索这个特定问题可以找到更多答案,具体取决于您的用例。

【讨论】:

  • 好的,我认为问题在于我的environment 部分位于web 服务中。现在我得到FATAL: password authentication failed for user "myuser"。我现在想知道的是如何创建数据库用户并运行迁移,以便连接到工作数据库。
  • @nandesuka 更新了我的答案
猜你喜欢
  • 2021-10-16
  • 2020-10-03
  • 1970-01-01
  • 2017-05-25
  • 2019-07-31
  • 2023-03-04
  • 2021-08-25
  • 2017-12-16
  • 2016-03-07
相关资源
最近更新 更多