Yogesh Ojha
Yogesh Ojha

Reputation: 91

Built Docker image cannot reach postgreSQL

I am using Django and PostgreSQL as different containers for a project. When I run the containers using docker-compose up, my Django application can connect to the PostgreSQL, but the same, when I build the docker image with docker build . --file Dockerfile --tag rengine:$(date +%s), the image successfully builds, but on the entrypoint.sh, it is unable to find host as db.

My docker-compose file is

version: '3'

services:
    db:
        restart: always
        image: "postgres:12.3-alpine"
        environment:
            - POSTGRES_DB=postgres
            - POSTGRES_USER=postgres
            - POSTGRES_PASSWORD=postgres
            - POSTGRES_PORT=5432
        ports:
            - "5432:5432"
        volumes:
            - postgres_data:/var/lib/postgresql/data/
        networks:
            - rengine_network
    web:
        restart: always
        build: .
        command: python3 manage.py runserver 0.0.0.0:8000
        volumes:
          - .:/app
        ports:
          - "8000:8000"
        depends_on:
            - db
        networks:
            - rengine_network

networks:
    rengine_network:
volumes:
  postgres_data:

Entrypoint

#!/bin/sh

if [ "$DATABASE" = "postgres" ]
then
    echo "Waiting for postgres..."

    while ! nc -z db 5432; do
      sleep 0.1
    done

    echo "PostgreSQL started"
fi

python manage.py migrate

# Load default engine types
python manage.py loaddata fixtures/default_scan_engines.json --app scanEngine.EngineType

exec "$@"

and Dockerfile

# Base image
FROM python:3-alpine

# Labels and Credits
LABEL \
    name="reNgine" \
    author="Yogesh Ojha <[email protected]>" \
    description="reNgine is a automated pipeline of recon process, useful for information gathering during web application penetration testing."

ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1

RUN apk update \
    && apk add --virtual build-deps gcc python3-dev musl-dev \
    && apk add postgresql-dev \
    && apk add chromium \
    && apk add git \
    && pip install psycopg2 \
    && apk del build-deps

# Copy requirements
COPY ./requirements.txt /tmp/requirements.txt
RUN pip3 install -r /tmp/requirements.txt

# Download and install go 1.13
COPY --from=golang:1.13-alpine /usr/local/go/ /usr/local/go/

# Environment vars
ENV DATABASE="postgres"
ENV GOROOT="/usr/local/go"
ENV GOPATH="/root/go"
ENV PATH="${PATH}:${GOROOT}/bin"
ENV PATH="${PATH}:${GOPATH}/bin"

# Download Go packages
RUN go get -u github.com/tomnomnom/assetfinder github.com/hakluke/hakrawler github.com/haccer/subjack

RUN GO111MODULE=on go get -u -v github.com/projectdiscovery/httpx/cmd/httpx \
    github.com/projectdiscovery/naabu/cmd/naabu \
    github.com/projectdiscovery/subfinder/cmd/subfinder \
    github.com/lc/gau

# Make directory for app
RUN mkdir /app
WORKDIR /app

# Copy source code
COPY . /app/

# Collect Static
RUN python manage.py collectstatic --no-input --clear

RUN chmod +x /app/tools/get_subdomain.sh
RUN chmod +x /app/tools/get_dirs.sh
RUN chmod +x /app/tools/get_urls.sh
RUN chmod +x /app/tools/takeover.sh

# run entrypoint.sh
ENTRYPOINT ["/app/docker-entrypoint.sh"]

When I run the build image, it says no such host db, on entrypoint.sh file.

Can somebody help me, where am I going wrong?

Upvotes: 0

Views: 540

Answers (1)

Adiii
Adiii

Reputation: 59936

Base on a comment the error appeared during

docker run rengine:1234,

So the error is expected in this case, as hostname db will only work in the docker-compose network. Inside docker-compose stack one service can communicate with other service using service name, but in case of docker run both container running in isolated environment.

You have two option to resolve this issue

  • Run the DB container and use legacy-link to link the application container with DB
docker run -it --name db mydb_image
# now link application container
docker run -it --link db:db rengine:1234

Now the container will able to communicate with host db.

  • Second option is to create docker network and then run both container in same network.
docker run -itd --network=mynetwork db

docker run -itd --network=mynetwork app

But you are already using docker-compose, so better to do testing with docker-compose.

Upvotes: 3

Related Questions