【问题标题】:manage.py test error in Django involving django.db.utils.OperationalError涉及 django.db.utils.OperationalError 的 Django 中的 manage.py 测试错误
【发布时间】:2018-05-16 16:42:44
【问题描述】:

我在运行 python manage.py test 时收到以下错误

django.db.utils.OperationalError:无法将主机名“db”转换为地址:提供节点名或服务名,或未知

我的 docker-compose.yml 看起来像这样:

version: '3'

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

我的 dockerfile 看起来像

FROM python:3
ENV PYTHONUNBUFFERED 1
RUN mkdir /code
WORKDIR /code
ADD requirements.txt /code/
RUN pip install -r requirements.txt
ADD . /code/
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh

请告诉我有关如何解决此问题的任何见解。

【问题讨论】:

    标签: python html django


    【解决方案1】:

    因为他们不在同一个网络中,

    您应该创建一个网络并在其中包含 db 和 web,

    version: '3'
    
    services:
      db:
        image: postgres
        ports:
          - "5432:5432"
        networks:
          - backend
    
    
      web:
        entrypoint: /entrypoint.sh
        build: .
        command: python3 manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/code
        ports:
          - "8000:8000"
        depends_on:
          - db
        networks:
          - backend
    
    networks:
      backend:
        driver: bridge
    

    【讨论】:

    • 我做到了,但这并没有改变任何东西。还有其他线索吗?
    【解决方案2】:

    小心不要为数据库暴露端口

    version: '3'
    
    services:
      db:
        image: postgres
      environment:
        POSTGRES_PASSWORD: <password>
        POSTGRES_USER: postgres
      networks:
        - backend
    

    在您的 Django settings.py 中,您现在可以使用 db 作为您的主机名而不是 localhost。

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

    您的web 服务保持不变,因为该服务需要将容器的端口 8000 绑定到您的localhost:8000

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-09
      • 1970-01-01
      • 1970-01-01
      • 2019-05-02
      相关资源
      最近更新 更多