Установка геопространственных библиотек в Docker - PullRequest
1 голос
/ 01 октября 2019

В официальной документации Django перечислены 3 зависимости, необходимые для начала разработки приложения PostGIS. Они перечисляют таблицу в зависимости от базы данных.

Я использую docker для своей локальной разработки, и я не понимаю, какие из этих пакетов должны быть установлены в контейнере Django, а какие в контейнере PostgreSQL. Я предполагаю, что некоторые из них должны быть на обоих.

Буду признателен за вашу помощь с этим.

1 Ответ

1 голос
/ 02 октября 2019

Вам необходимо установить геопространственные библиотеки только в контейнере Django , поскольку они используются для взаимодействия с пространственно включенной БД (такой как PostgreSQL с PostGIS). Вы можете развернуть такую ​​БД, используя в качестве основы готовый образ для этой цели, такой как kartoza / postgis .
Вот хороший пример файла Docker, которыйиспользует в качестве основы python: 3.6-slim и встраивает зависимости GDAL в контейнер. Для этого вам потребуется следующая часть Dockerfile:

FROM python:3.6-slim

ENV PYTHONUNBUFFERED=1

# Add unstable repo to allow us to access latest GDAL builds
# Existing binutils causes a dependency conflict, correct version will be installed when GDAL gets intalled
RUN echo deb http://deb.debian.org/debian testing main contrib non-free >> /etc/apt/sources.list && \
    apt-get update && \
    apt-get remove -y binutils && \
    apt-get autoremove -y

# Install GDAL dependencies
RUN apt-get install -y libgdal-dev g++ --no-install-recommends && \
    pip install pipenv && \
    pip install whitenoise && \
    pip install gunicorn && \
    apt-get clean -y

# Update C env vars so compiler can find gdal
ENV CPLUS_INCLUDE_PATH=/usr/include/gdal
ENV C_INCLUDE_PATH=/usr/include/gdal

ENV LC_ALL="C.UTF-8"
ENV LC_CTYPE="C.UTF-8"

Вы можете развернуть приложение Django и базу данных, используя docker-compose, , используя следующую команду docker-compose.yaml(из того же репозитория, что и в Dockerfile):

# Sample compose file for a django app and postgis
version: '3'

services:

  postgis:
    image: kartoza/postgis:9.6-2.4
    volumes:
      - postgis_data:/var/lib/postgresql
    environment:
      ALLOW_IP_RANGE: 0.0.0.0/0
      POSTGRES_PASS: ${POSTGRES_PASSWORD}
      POSTGRES_USER: ${POSTGRES_USER}
      POSTGRES_DB: postgis

  web:
    image: intelligems/geodjango:latest
    command: python manage.py runserver 0.0.0.0:8000
    environment:
      DEBUG: "True"
      SECRET_KEY: ${SECRET_KEY}
      DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@postgis:5432/postgis
      SENTRY_DSN: ${SENTRY_DSN}
    ports:
      - 8000:8000
    depends_on:
      - postgis

volumes:
  postgis_data: {}

В этом репозитории вы можете найти больше информации и интересных деталей конфигурации для вашей проблемы: https://github.com/intelligems/docker-library/tree/master/geodjango (приведенный выше фрагмент Dockerfile взят изрепо).


Как примечание:
Если вы хотите создать PostgreSQL с базой данных с поддержкой PostGIS в качестве «локальной БД» для взаимодействия с вашим локальным Django,Вы можете развернуть ранее упомянутый kartoza / postgis :
  1. Создать том:

    $ docker volume create postgresql_data
    
  2. Развернуть контейнер:

    $ docker run \
          --name=postgresql-with-postgis -d \
          -e POSTGRES_USER=user_name \
          -e POSTGRES_PASS=user_pass \
          -e ALLOW_IP_RANGE=0.0.0.0/0 -p 5433:5432 \
          -v postgresql_data:/var/lib/postgresql \
          --restart=always \
          kartoza/postgis:9.6-2.4
    
  3. Подключитесь к БД по умолчанию (postgres) контейнера и создайте свою БД:

    $ psql -h localhost -U user_name -d postgres
    $ CREATE DATABASE database_name;
    
  4. ВключитьРасширение PostGIS для базы данных:

    $ \connect database_name
    $ CREATE EXTENSION postgis;
    

Это приведет к созданию БД с именем database_name listПосле того, как вы подключитесь к порту 5432 вашего локального хоста, вы можете подключиться к нему из локального приложения Django.

...