Я использую django, postgresql, redis, каналы, инструменты Docker для своего проекта. У меня есть проблема с изображением Docker postgresql.

Когда я запускаю команду docker-compose up, возникает эта ошибка:

django.db.utils.OperationalError: не удалось перевести имя хоста «postgres_db» на адрес: временный сбой в разрешении имен

Мой файл 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:

Мой докерфайл:

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.

«мое изображение postgresql не видно». Я предполагаю, что вы имеете в виду «контейнер», а не «изображение». Что бы вы ни пытались использовать «docker compose up» без флага -d. Это помогает? Кстати, docker-compose теперь устарел — вы должны правильно установить и использовать «docker compose», docs.docker.com/compose/install/linux.

johnfo 10.01.2023 15:20
Типы данных JavaScript
Типы данных JavaScript
В JavaScript существует несколько типов данных, включая примитивные типы данных и ссылочные типы данных. Вот краткое объяснение различных типов данных...
Как сделать движок для футбольного матча? (простой вариант)
Как сделать движок для футбольного матча? (простой вариант)
Футбол. Для многих людей, живущих на земле, эта игра - больше, чем просто спорт. И эти люди всегда мечтают стать футболистом или менеджером. Но, к...
Знайте свои исключения!
Знайте свои исключения!
В Java исключение - это событие, возникающее во время выполнения программы, которое нарушает нормальный ход выполнения инструкций программы. Когда...
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик
CSS Flex: что должен знать каждый разработчик Модуль flexbox, также известный как гибкий модуль разметки box, помогает эффективно проектировать и...
Введение в раздел "Заголовок" в HTML
Введение в раздел "Заголовок" в HTML
Говорят, что лучшее о человеке можно увидеть только изнутри, и это относится и к веб-страницам HTML! Причина, по которой некоторые веб-страницы не...
2
1
68
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема в том, что вы объявили сеть для службы djangouwsgi с помощью:

networks: 
  - webnet
  - redisnet

Это означает, что этот контейнер сможет связываться только с контейнерами в сети webnet или redisnet.

С другой стороны, вы не настроили сеть для службы postgres_db, поэтому эта служба не может обмениваться данными со службами.

Я предлагаю добавить сеть в службу postgres и включить djangouwsgi в ту же сеть.

Другой вариант — просто удалить все определения сетей, чтобы все контейнеры внутри компоновочного файла находились в одной сети и могли обмениваться данными друг с другом.

Я также рекомендую удалить все блоки networks: во всем файле. links: также устарели и потенциально проблематичны, и я также предлагаю удалить их.

David Maze 10.01.2023 15:47

Другие вопросы по теме