diff --git a/Dockerfile b/Dockerfile index 24afeb9..9a524ee 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,21 +1,20 @@ -FROM python:3.8-alpine +FROM python:3.10-slim-bullseye -RUN apk update \ - && apk add --virtual build-deps gcc python3-dev musl-dev \ - && apk add bash \ - && apk add postgresql \ - && apk add postgresql-dev \ - && pip install psycopg2 \ - && apk add jpeg-dev zlib-dev libjpeg \ - && pip install Pillow \ - && apk del build-deps +# Install apt packages +RUN apt-get update && apt-get install --no-install-recommends -y \ + # dependencies for building Python packages + build-essential \ + # psycopg2 dependencies + libpq-dev \ + # Translations dependencies + gettext \ + # cleaning up unused files + && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \ + && rm -rf /var/lib/apt/lists/* -WORKDIR /code/ COPY . /code/ WORKDIR /code/ -RUN pip install -r /code/test/example/requirements.txt - -RUN apk add --no-cache postgresql-libs - -ENTRYPOINT ["/code/docker-entrypoint.sh"] +RUN pip install -r /code/test/example/requirements.txt \ + && pip install psycopg2 \ + && python -m pip install django-comments-dab[markdown] diff --git a/docker-compose.yml b/docker-compose.yml index 923a347..1c7b397 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,7 +6,9 @@ services: build: context: . dockerfile: Dockerfile - command: python manage.py runserver 0.0.0.0:8000 + command: > + bash -c "python wait_for_postgres.py && + /code/docker-entrypoint.sh" ports: - "8000:8000" volumes: @@ -26,7 +28,7 @@ services: DB_PORT: 5432 DB_USER: postgres db: - image: postgres:9.6 + image: postgres:14 ports: - "5432:5432" environment: diff --git a/test/example/requirements.txt b/test/example/requirements.txt index 1cece85..972b934 100644 --- a/test/example/requirements.txt +++ b/test/example/requirements.txt @@ -9,4 +9,4 @@ beautifulsoup4 cssselect coverage flake8 -tox +tox \ No newline at end of file diff --git a/wait_for_postgres.py b/wait_for_postgres.py new file mode 100644 index 0000000..2c4d602 --- /dev/null +++ b/wait_for_postgres.py @@ -0,0 +1,36 @@ +import os +import logging +from time import time, sleep +import psycopg2 +check_timeout = os.getenv("POSTGRES_CHECK_TIMEOUT", 30) +check_interval = os.getenv("POSTGRES_CHECK_INTERVAL", 1) +interval_unit = "second" if check_interval == 1 else "seconds" +config = { + "dbname": os.getenv("DB_NAME", "postgres"), + "user": os.getenv("DB_USER", "postgres"), + "password": os.getenv("DB_PASSWORD", "django-comments-dab"), + "host": os.getenv("DB_HOST", "db") +} + +start_time = time() +logger = logging.getLogger() +logger.setLevel(logging.INFO) +logger.addHandler(logging.StreamHandler()) + + +def pg_isready(host, user, password, dbname): + while time() - start_time < check_timeout: + try: + conn = psycopg2.connect(**vars()) + logger.info("Postgres is ready! ✨ 💅") + conn.close() + return True + except psycopg2.OperationalError: + logger.info(f"Postgres isn't ready. Waiting for {check_interval} {interval_unit}...") + sleep(check_interval) + + logger.error(f"We could not connect to Postgres within {check_timeout} seconds.") + return False + + +pg_isready(**config)