尝试将 Docker + Django 连接到 Postgres - 无法将主机名"db"转换为地址:名称或服务不知道



我正试图按照本教程对Django+Postres项目进行Dockerize: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

设置.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,
    }
}

很可能您的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初始化SQL Server中的数据库表和记录。这是一个流行的问题,根据你的用例,在谷歌上搜索这个特定的问题可以找到更多的答案。

相关内容

最新更新