django - 我在我的项目中使用 django、postgresql、redis、channels、Docker 工具。我对 Docker postgresql 镜像有一些问题

标签 django postgresql docker redis channel

当我运行docker-compose up命令时,出现此错误:

django.db.utils.OperationalError: could not translate host name "postgres_db" to address: Temporary failure in name resolution

我的 docker-compose.yml 文件:

version: "3.5"

services:
  redis:
    image: redis:latest
    networks: 
      - redisnet

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

  django_wsgi:
    container_name: django_wsgi
    build:
      context: .
    command: uwsgi --socket=:9000 --module=core.wsgi:application --py-autoreload=1
    volumes:
      - .:/code
    env_file:
      - .env
    networks: 
      - webnet
      - redisnet
    links:
      - redis
      - postgres_db:postgres_db
    depends_on:
      - postgres_db
  
  django_asgi:
    container_name: django_asgi
    build: .
    # command: python manage.py runserver 0.0.0.0:8002
    command: daphne -b 0.0.0.0 -p 8002  core.asgi:application
    env_file:
      - .env
    volumes:
      - .:/code
    networks: 
      - webnet
      - redisnet
    links:
      - redis
      - postgres_db:postgres_db
    depends_on:
      - postgres_db
      
  nginx:
    image: nginx:1.15.0
    depends_on:
      - django_asgi
      - django_wsgi
    volumes:
      - ./nginx:/etc/nginx/conf.d
      - ./static:/static
    networks:
      - webnet
    ports:
      - "80:80"

networks: 
  webnet:
  redisnet:

我的 Dockerfile:

FROM python:3.8

ENV PYTHONUNBUFFERED 1 
ENV REDIS_HOST "redis" 
RUN mkdir /code 
WORKDIR /code

RUN pip install --upgrade pip 
RUN pip install psycopg2

COPY requirements.txt /code/ 
RUN pip install uwsgi 
RUN apt-get update && apt-get install -y tdsodbc unixodbc-dev

RUN pip install -r requirements.txt 
ADD . /code/

我的 nginx default.conf 文件:

upstream django_wsgi {
  server  django_wsgi:9000;
}

upstream django_asgi {
    server django_asgi:8002;
}

map $http_upgrade $connection_upgrade {
  default upgrade;
    '' close;
}

server {
    listen 80           default_server;
    root                /usr/src/app;
    index               index.html;
    client_max_body_size 60M;

    location / {
      include /etc/nginx/uwsgi_params;
      uwsgi_pass django_wsgi;

      uwsgi_param Host $host;
      uwsgi_param X-Real-IP $remote_addr;
      uwsgi_param X-Forwarded-For $proxy_add_x_forwarded_for;
      uwsgi_param X-Forwarded-Proto $http_x_forwarded_proto;
    }

    location /chat/stream/ {
      proxy_pass http://django_asgi;
      proxy_http_version 1.1;
      proxy_set_header Upgrade $http_upgrade;
      proxy_set_header Connection $connection_upgrade;
      
      proxy_redirect     off;
      proxy_set_header   Host $host;
      proxy_set_header   X-Real-IP $remote_addr;
      proxy_set_header   X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header   X-Forwarded-Host $server_name;
    }

    location /static {
        alias /static;
    }
}

我认为由于某种原因我的 postgresql 镜像不可见 - 但该镜像已创建,我可以在 Docker Desktop 中看到它。

最佳答案

问题是您为 djangouwsgi 服务声明了一个网络:

networks: 
  - webnet
  - redisnet

这意味着该容器只能联系 webnetredisnet 网络中的容器。

另一方面,您没有为 postgres_db 服务设置任何网络,因此该服务无法与其他服务进行通信。

我建议向 postgres 服务添加一个网络,并将 djangouwsgi 包含在同一网络下。

另一种选择是仅删除所有网络定义,因此 compose 文件内的所有容器都将位于同一网络上,并且它们将能够相互通信。

关于django - 我在我的项目中使用 django、postgresql、redis、channels、Docker 工具。我对 Docker postgresql 镜像有一些问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75071178/

相关文章:

postgresql - 在 pg_dump 中传输时区

django - 使用gunicorn + nginx 长时间运行请求

mysql - 将数据从 PostgreSQL 传输到 MySQL

python - Django:查询数据库

regex - 这个 RegEX 替换表达式有什么作用?

Spring Boot、Docker 和 EC2 中的 Java 版本

docker - Traefik v2在端口上监听

windows - 在 Docker for Windows 中,如何防止容器在守护进程启动时自动启动?

Django和HTML无法从指定时间开始视频

python - 在 Django 中,如何更改 User 类以使用不同的数据库表?