"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
который содержит пример файла композиции