在seetings.py或docker中数据库配置错误

时间:2019-01-11 08:20:23

标签: python django postgresql docker docker-compose

我正在使用本手册https://docs.docker.com/compose/django/

学习如何使用Compose + Django。

这是我的配置文件

docker-compose.yml

version: '3'

services:
  db:
    image: postgres
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

setting.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

当我使用docker-compose up运行时,一切都很好。

但是当我使用python manage.py runserver运行时,出现此错误 psycopg2.OperationalError: could not translate host name "db" to address: Name or service not known

猜猜,我的配置错误

3 个答案:

答案 0 :(得分:1)

您忘记在hostname服务中设置db

version: '3'

services:
  db:
    image: postgres
    hostname: db
  web:
    build: .
    command: python3 manage.py runserver 0.0.0.0:8000
    volumes:
      - .:/code
    ports:
      - "8000:8000"
    depends_on:
      - db

提示:部署生产服务器时不要使用runserver。选中this doc

解决方案在评论中描述

编辑)

单独的设置示例。在设置文件夹中将原始settings.py更改为base.py

<your_app>/settings/local.py

from .base import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'localhost',
        'PORT': 5432,
    }
}

<your_app>/settings/deploy.py

from .base import *

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

因此,最后,您的settings文件夹包含三个python文件。 base.pylocal.pydeploy.py

使用本地设置运行服务器时,python manage.py runserver --settings <your_app>.settings.local

答案 1 :(得分:0)

我猜您正在尝试在主机上运行manage.py runserver。错误意味着,您无法从中访问主机“ db”(尝试在控制台中ping db)。造成这种情况的原因有很多:

  1. 您的Docker容器数据库已关闭。尝试运行docker-compose up -d db
  2. 您正在使用Windows作为主机系统。在Windows中,无法从主机访问容器,必须在本地安装postgres。
  3. 您遇到网络问题。尝试ping 127.0.0.11(这是docker的DNS服务器)

P.S。您是否真的希望本地Django在容器中使用Postgres?

答案 2 :(得分:-1)

这是docker / django设置中的常见问题,postgres容器已初始化,但引擎尚未就绪。 在运行Web容器之前,您必须等待PostgreSQL服务器启动。

您可以通过多种方式进行操作,请看dockerize

dockerize -timeout=20s -wait ${POSTGRES_PORT}