【问题标题】:Docker django.db.utils.OperationalError: could not translate host name "db" to address: Temporary failure in name resolutionDocker django.db.utils.OperationalError:无法将主机名“db”转换为地址:名称解析暂时失败
【发布时间】:2021-10-03 12:08:25
【问题描述】:

似乎是一个常见错误。我遵循了关于 Stackoverflow 的所有可能建议(添加链接、网络等),但在我的情况下没有任何区别。我在 Windows 上运行。

我的 Dockerfile:

#Pull base image.
FROM python:3.9.5-slim

#Usefull to get logs
ENV PYTHONUNBUFFERED 1

#Make local dir
RUN mkdir -p /app

#set as the working directory
WORKDIR /app

#https://luis-sena.medium.com/creating-the-perfect-python-dockerfile-51bdec41f1c8
COPY requirements.txt .

#now copy all the files in this directory to \code
ADD . .

#https://testdriven.io/blog/dockerizing-django-with-postgres-gunicorn-and-nginx/
RUN apt-get update && \
 apt-get install -y postgresql-server-dev-all gcc python3-dev musl-dev && \
 pip install -r requirements.txt && \
 adduser --disabled-password --no-create-home app

USER app

#CMD python manage.py runserver
CMD gunicorn --bind 0.0.0.0:8000 app.wsgi:application -k eventlet

接下来,我的 docker-compose.yml:

services:
  web:
    build: .
    ports:
      - "8000:8000"
    volumes:
      - .:/app
    links:
      - db:db
    container_name: heritageapi_web_1
    depends_on:
      - db
    networks:
      - heritage-network

  db:
    image: postgres:13.3
    container_name: db
    restart: always
    networks:
      - heritage-network
    environment:
      POSTGRES_DATABASE: admin
      POSTGRES_USER: root
      POSTGRES_PASSWORD: root
      POSTGRES_ROOT_PASSWORD: root
    volumes:
      - .dbdata:/var/lib/postgres
    ports:
      - "32768:5432"

networks:
  heritage-network:
    driver: bridge

我的 .env:DB_NAME=admin DB_USER=root DB_PASSWORD=root DB_HOST=db DB_PORT=5432

最后是我的 settings.py:

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.postgresql',
        'NAME': os.getenv('DB_NAME'),
        'USER': os.getenv('DB_USER'),
        'PASSWORD': os.getenv('DB_PASSWORD'),
        'HOST': os.getenv('DB_HOST'),
        'PORT': os.getenv('DB_PORT'),
    }
}

【问题讨论】:

  • 不应该是:os.getenv('POSTGRES_DATABASE')?其他env 变量也应该更改吗?

标签: python django postgresql docker django-rest-framework


【解决方案1】:

我没有在 Web 容器中看到 .env 文件。应该是这样的:

services:
  web:
   depends_on:
    - db
   env_file:
    - .env.dev

如果一切正常,然后使用docker-compose exec 进入正在运行的 docker 容器并打印

python manage.py shell
>> from django.conf import settings
>> settings.DB_HOST

【讨论】:

  • 感谢您的回复。我的 .env 文件是通过卷“传输”的:据我所知。顺便说一句,我刚刚观察到我得到的这个错误只是通过 Pycharm。当我 ssh 进入 docker 容器时,没有问题。我能够执行迁移等。可能是 Pycharm 的问题。
  • 尝试在 Pycharm 中手动设置 .env,而不是通过文件
猜你喜欢
  • 1970-01-01
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-21
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
相关资源
最近更新 更多