[Python] Docker-Compose Error When Building Django Dockerfile: Error -2 connecting to...

Discussão em 'Python' iniciado por Stack, Março 12, 2025.

  1. Stack

    Stack Membro Participativo

    I’m trying to set up an open-source status page application using the repository from Status-Page/Status-Page with Docker Compose. When I run docker-compose up -d, I encounter an error during the build process of the Django service’s Dockerfile. The error seems to occur at the Upgrade and initialize application, but I’m not sure how to debug it further or resolve it. Here’s my setup:

    Dockerfile:

    # Use the official Python runtime image
    FROM python:3.12.3

    # Create the app directory
    RUN mkdir -p /opt/status-page/

    # Set the working directory inside the container
    WORKDIR /opt/status-page/

    # Set environment variables
    # Prevents Python from writing pyc files to disk
    ENV PYTHONDONTWRITEBYTECODE=1
    # Prevents Python from buffering stdout and stderr
    ENV PYTHONUNBUFFERED=1

    # Install system dependencies
    RUN apt-get update && apt install -y libpq-dev gcc

    # Create a system user and group
    RUN adduser --system --group status-page

    # Set ownership of the app directory
    RUN chown -R status-page:status-page /opt/status-page/

    # Upgrade pip
    RUN pip install --upgrade pip

    # Copy the Django project to the container
    ADD status-page /opt/status-page/

    # Grant execute permissions to upgrade.sh
    RUN chmod +x /opt/status-page/upgrade.sh

    # Install Python dependencies
    RUN python -m venv /opt/status-page/venv \
    && /opt/status-page/venv/bin/pip install --no-cache-dir -r requirements.txt

    # Upgrade and initialize application
    RUN /opt/status-page/upgrade.sh
    RUN /opt/status-page/venv/bin/python /opt/status-page/statuspage/manage.py migrate
    RUN /opt/status-page/venv/bin/python /opt/status-page/statuspage/manage.py createsuperuser --noinput

    # Copy Gunicorn and systemd service files
    RUN cp /opt/status-page/contrib/gunicorn.py /opt/status-page/gunicorn.py \
    && cp -v /opt/status-page/contrib/*.service /etc/systemd/system/ \
    && systemctl daemon-reload

    # Expose the Django port
    EXPOSE 8000

    # Start Gunicorn
    CMD ["/opt/status-page/venv/bin/gunicorn", "-c", "/opt/status-page/gunicorn.py", "statuspage.wsgi:application"]


    docker-compose.yml:

    version: '3.9'

    services:
    # PostgreSQL service
    db:
    image: postgres:15
    container_name: status-page-db
    environment:
    POSTGRES_USER: status-page
    POSTGRES_PASSWORD: abcdefgh123456
    POSTGRES_DB: status-page
    volumes:
    - postgres_data:/var/lib/postgresql/data
    healthcheck:
    test: ["CMD-SHELL", "pg_isready -U status-page -d status-page"]
    interval: 10s
    timeout: 5s
    retries: 5
    networks:
    - status_page_network

    # Redis service
    redis:
    image: redis:6
    container_name: status-page-redis
    ports:
    - "6379:6379"
    hostname: redis_host
    healthcheck:
    test: ["CMD", "redis-cli", "ping"]
    interval: 10s
    timeout: 5s
    retries: 5
    networks:
    - status_page_network

    # Django (Status-Page) service
    django:
    build: ./statuspage
    container_name: status-page-django
    environment:
    DATABASE_NAME: status-page
    DATABASE_USER: status-page
    DATABASE_PASSWORD: abcdefgh123456
    DATABASE_HOST: db
    REDIS_HOST: redis_host
    REDIS_PORT: 6379
    SECRET_KEY: Pv)hkWbYxkpaD_dh$ULGa6MF#ADn6&=MU&#v5cjRyViuTbPHuG
    volumes:
    - ./status-page:/opt/status-page
    - status-page-venv:/opt/status-page/venv
    depends_on:
    db:
    condition: service_healthy
    redis:
    condition: service_healthy
    expose:
    - "8000"
    command: /opt/status-page/venv/bin/gunicorn -c /opt/status-page/gunicorn.py statuspage.wsgi:application
    networks:
    - status_page_network

    # Nginx service
    nginx:
    image: nginx:latest
    container_name: status-page-nginx
    volumes:
    - ./nginx.conf:/etc/nginx/nginx.conf
    - ./status-page/static:/usr/share/nginx/html/static
    ports:
    - "80:80"
    - "443:443"
    depends_on:
    - django
    networks:
    - status_page_network
    environment:
    - NGINX_HOST=status-page.example.com
    - NGINX_PORT=80

    volumes:
    postgres_data:
    status-page-venv:

    networks:
    status_page_network:
    driver: bridge


    Configuration (snippet):

    ALLOWED_HOSTS = ['*']

    # PostgreSQL database configuration. See the Django documentation for a complete list of available parameters:
    # https://docs.djangoproject.com/en/stable/ref/settings/#databases
    DATABASE = {
    'NAME': 'status-page', # Database name
    'USER': 'status-page', # PostgreSQL username
    'PASSWORD': 'abcdefgh123456', # PostgreSQL password
    'HOST': 'db', # Database server
    'PORT': '5432', # Database port (leave blank for default)
    'CONN_MAX_AGE': 300, # Max database connection age
    }

    # Redis database settings. Redis is used for caching and for queuing background tasks. A separate configuration exists
    # for each. Full connection details are required.
    REDIS = {
    'tasks': {
    'HOST': 'redis_host',
    'PORT': 6379,
    # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel
    # 'SENTINELS': [('mysentinel.redis.example.com', 6379)],
    # 'SENTINEL_SERVICE': 'status-page',
    'PASSWORD': '',
    'DATABASE': 0,
    'SSL': False,
    # Set this to True to skip TLS certificate verification
    # This can expose the connection to attacks, be careful
    # 'INSECURE_SKIP_TLS_VERIFY': False,
    },
    'caching': {
    'HOST': 'redis_host',
    'PORT': 6379,
    # Comment out `HOST` and `PORT` lines and uncomment the following if using Redis Sentinel
    # 'SENTINELS': [('mysentinel.redis.example.com', 6379)],
    # 'SENTINEL_SERVICE': 'netbox',
    'PASSWORD': '',
    'DATABASE': 1,
    'SSL': False,
    # Set this to True to skip TLS certificate verification
    # This can expose the connection to attacks, be careful
    # 'INSECURE_SKIP_TLS_VERIFY': False,
    }
    }


    The Problem: redis.exceptions.ConnectionError: Error -2 connecting to redis:6379. Name or service not known.

    What I’ve Tried:

    1. I updated DATABASE_HOST to db in the environment variables of the docker-compose.yml to match the service name.
    2. I confirmed that the depends_on with service_healthy conditions are set for db and redis, but these only apply at runtime, not during the build.

    How to solve it?

    Continue reading...

Compartilhe esta Página