"OperationalError: Не удалось преобразовать имя хоста "db" в адрес" в докеризованном Django-приложении с Datadog

У меня есть очень сложный проект django, который использует postgresql в качестве базы данных, где я настроил datadog для отправки трасс и событий. Он отлично работает локально, и я получаю трассировки и события в datadog. Однако если я пытаюсь запустить свое приложение с помощью docker, оно не отправляет трассировки и события в datadog. Ниже приведен мой docker-compose.yml файл, в котором интеграция с datadog заимствована из здесь.

docker-compose.yml
services:
  db:
    image: ankane/pgvector
    env_file:
      - ./docker/env.db
    volumes:
      - pgvector_db_data:/var/lib/postgresql/data

  app:
    build:
      context: .
      dockerfile: ./docker/prod.Dockerfile
    env_file:
      - ./docker/env.db
      - ./.env
    container_name: scooprank
    volumes:
      - static_volume:/opt/code/static
      - shm:/dev/shm
      - save_drivers:/opt/code/save_drivers
      - save_models:/opt/code/save_models
    command: ./docker/scripts/run-gunicorn
    depends_on:
      - db
    network_mode: host

  ddagent:
    image: datadog/docker-dd-agent
    environment:
      - DD_BIND_HOST=0.0.0.0
      - DD_API_KEY=${DATADOG_API_KEY}
      - DD_APM_RECEIVER_SOCKET=/tmp/ddagent/trace.sock
      - DD_DOGSTATSD_NON_LOCAL_TRAFFIC=true
    ports:
      - "8127:8126"

  news_scraper:
    image: scooprank-app
    env_file:
      - ./.env
    container_name: news_scraper
    command: python manage.py news_scraper
    depends_on:
      - app
    restart: always

volumes:
  static_volume:
  shm:
  save_drivers:
  save_models:
  pgvector_db_data:

Я добавил network_mode: host, как было предложено в этом ответе. Затем я попробовал это решение на простом фиктивном проекте с sqlite3 в качестве базы данных, и с помощью этого файла docker-compose я получаю трассировки и события. Но если я попытаюсь использовать его в своем основном проекте, я могу сделать docker compose build и docker compose up, но при миграции я получаю ошибку.

Ниже приведены другие мои файлы на случай, если они понадобятся:

env.db
POSTGRES_PASSWORD=secret
POSTGRES_DB=scooprank
POSTGRES_USER=postgres
prod.Dockerfile
FROM python:3.11.5

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV LANG C.UTF-8
ENV LC_ALL C.UTF-8

# Add buster Postgres repo. This is necessary to install postgresql-client-12
RUN wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
RUN echo "deb http://apt.postgresql.org/pub/repos/apt/ buster-pgdg main" | tee  /etc/apt/sources.list.d/pgdg.list

RUN apt-get update && apt-get install -y \
    postgresql-client-12 \
    build-essential \
    libcairo2-dev \
    libpango1.0-dev \
    libjpeg-dev \
    libgif-dev \
    librsvg2-dev \
    g++ \
    xvfb

RUN curl -fsSL https://deb.nodesource.com/setup_20.x | bash -
RUN apt-get install -y nodejs

RUN pip install pip==24.0

WORKDIR /opt/code

COPY package.json package.json
COPY package-lock.json package-lock.json

RUN npm install

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

RUN python -m nltk.downloader punkt averaged_perceptron_tagger wordnet omw-1.4

COPY . ./
.env файл
DATABASE_URL=postgres://postgres:secret@db/scooprank
CSRF_TRUSTED_ORIGINS=http://127.0.0.1:8006
DATADOG_API_KEY=<my_api_key>
DATADOG_APP_KEY=<my_app_key>
STATSD_HOST=127.0.0.1
STATSD_PORT=8125
settings.py
# Database 

DATABASES = {"default": env.dj_db_url("DATABASE_URL")}

# Datadog

if not DEBUG and env.str("DATADOG_API_KEY"):
    DATADOG_OPTIONS = {
        "api_key": env.str("DATADOG_API_KEY"),
        "app_key": env.str("DATADOG_APP_KEY"),
        "statsd_host": env.str("STATSD_HOST"),
        "statsd_port": env.int("STATSD_PORT"),
    }

    initialize(**DATADOG_OPTIONS)

Я пытался изменить url моей базы данных, чтобы использовать localhost вместо db, но безуспешно. Я также попробовал добавить networks в свои службы, но безрезультатно. Если я удалю службу ddtrace и network_mode: host, мое приложение будет работать нормально, но без отправки трасс и событий в datadog.

Удалите network_mode: host, это выведет ваше приложение за пределы сети, созданной docker compose по умолчанию, и поэтому ваше приложение не сможет получить доступ к Postgres, который находится в сети по умолчанию.

Установите переменную env DD_TRACE_AGENT_HOSTNAME=ddagent на сервисе app. Скорее всего, это не единственное изменение, требуемое в вашем файле compose; см. ниже.


Обратитесь к https://github.com/DataDog/trace-examples за более подробной информацией. В репо есть специальный раздел Django

который содержит пример файла композиции

Вернуться на верх