在 Docker 中安装地理空间库

Posted

技术标签:

【中文标题】在 Docker 中安装地理空间库【英文标题】:Installing Geospatial libraries in Docker 【发布时间】:2020-01-31 01:52:09 【问题描述】:

Django 的官方文档列出了开始开发 PostGIS 应用程序所需的 3 个依赖项。他们根据数据库列出一个表。

我使用 docker 进行本地开发,我对哪些包应该安装在 Django 容器中以及哪些包应该安装在 PostgreSQL 容器中感到困惑。我猜他们中的一些应该同时在两者上。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

您需要仅在 Django 容器中安装地理空间库,因为它们用于与启用空间的数据库(例如带有 PostGIS 的 PostgreSQL)进行交互。您可以使用现成的镜像作为基础来部署这样的数据库,例如使用 python:3.6-slim 作为基础并构建 GDAL 依赖项的 Dockerfile 的kartoza/postgis.Here is a nice example进入容器。您需要的 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"

您可以使用 docker-compose using the following docker-compose.yaml(来自与 Dockerfile 相同的存储库)部署 Django 应用和数据库:

# 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 sn-p 来自该存储库)。


作为说明: 如果你想创建一个启用 PostGIS 的 PostgreSQL 作为“本地数据库”来与你的本地 Django 交互,你可以部署前面提到的kartoza/postgis:

    创建卷:

    $ docker volume create postgresql_data
    

    部署容器:

    $ 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
    

    连接到容器的默认数据库 (postgres) 并创建您的数据库:

    $ psql -h localhost -U user_name -d postgres
    $ CREATE DATABASE database_name;
    

    为数据库启用 PostGIS 扩展:

    $ \connect database_name
    $ CREATE EXTENSION postgis;
    

这将导致一个名为 database_name 的数据库监听您本地主机的端口 5432,您可以从本地 Django 应用程序连接到该端口。

【讨论】:

以上是关于在 Docker 中安装地理空间库的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 PAT 从本地 Azure Artifacts 存储库在 docker 容器中安装 powershell 模块?

Docker Python2.7容器中安装第三方库GCC提示:file not recognized: File format not recognized

如何在docker中安装vsftp

如何在ubunto中安装docker

Linux中安装Docker,在Docker中安装MySQL和Redis并在Windows下连接访问

虚拟化Linux中安装配置Docker