zoukankan      html  css  js  c++  java
  • 用docker-compose部署postgres+ postgis

    20190411更新。之前写的太啰嗦,也不删了,重新来.小坑还是有的

    psql 命令行客户端

    因为postgres用docker镜像安装,所以host不需要安装pg,只需要安装客户端

    sudo apt-get install -y postgresql-client

    postgres+postGIS

    使用https://github.com/appropriate/docker-postgis  有各种版本组合,目前使用 pg11 + pGIS 2.5

    把3个文件放到1个文件夹里我这里是./machines/postgis,因为还有别的dockerfile。让docker-compose能找到

    # Use postgres/example user/password credentials
    version: '3.7'
    
    services:
    
      postgis: #postgres+ postGIS 安装 不塞入自己写的任何代码!
          #image: mdillon/postgis  #图省事可以直接用docker hub上的镜像
        build: ./machines/postgis
        restart: always
        environment:
            POSTGRES_PASSWORD: example
        volumes:
            - data_pg:/var/lib/postgresql/data
        ports:
          - "5432:5432"
        networks:
          mynet:
            ipv4_address: '172.19.0.12'
    
    
    networks:
      mynet:
        ipam:
          driver: default
          config:
            - subnet: 172.19.0.0/16
    
    volumes:
        data_pg:
          driver_opts:
            type: none
            #device: ./common
            device: /home/XXX/data_pg
            o: bind

    小坑: volume 用bind本地文件夹的方式,一定要先手工创建出 /home/XXX/data_pg 

    然后, 一定要注意挂载进去名字要一样. 今年文曲化忌,很容易因为这些小问题卡住

     

    networks是为了手工指定IP地址,真正和pg有关的是把本地文件夹作为volumes 命名为data_pg 挂进去,让pg能找到,这样数据保存在本地文件夹里。

    暴露pg的默认端口5432,用于pgadmin查看

    ----20190505发现的坑--------

    启动sh脚本需要时间,  多个服务的时候,或者原作者那样直接docker run 不会有问题

    但是,如果docker-compose 只包含1个pg服务的时候, 直接entrypoint就退了!  无论如何启动不好.

    卡了1晚上.

    不得不说,docker-compose 不是个适合定制初始化过程的工具.   服务间等待之类的都要依赖wait-for-it.sh,像这种只有1个服务的,反而问题更大.有点垃圾.

    主观原因:还是不够单一职责,  

    让docker-compose只负责把实例启动起来

    不要把初始化db这些工作,耦合进容器启动中这个生命周期里来,

    应该在启动后用别的方式搞定.

    于是一咬牙.舍掉sh脚本

    无非是用psql 连接pg 创建数据库模板, 安装postgis extention的语句.这些

    实测,完全可以用py通过pscopg2 搞定.

    ——果然,1小时搞定 

    多说几句,dockerfile写的很精简

    FROM postgres:12
    LABEL author xuqinghan

    ENV POSTGIS_MAJOR 3
    ENV POSTGIS_VERSION 3.0.0+dfsg-2~exp1.pgdg100+1
    RUN apt-get update 
          && apt-cache showpkg postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR 
          && apt-get install -y --no-install-recommends 
               postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR=$POSTGIS_VERSION 
               postgresql-$PG_MAJOR-postgis-$POSTGIS_MAJOR-scripts=$POSTGIS_VERSION 
               postgis=$POSTGIS_VERSION 
          && rm -rf /var/lib/apt/lists/*
    
    RUN mkdir -p /docker-entrypoint-initdb.d
    COPY ./initdb-postgis.sh /docker-entrypoint-initdb.d/postgis.sh
    COPY ./update-postgis.sh /usr/local/bin

    只要把sh考进去, 就能在最后结尾时自动当成entrypoint 执行

    这样,不需要显式写 ENTRYPOINT CMD

    #-------------------------------------------------------------------------------------------------- 

    dockerhub官网直接有postgis镜像,但是pg版本低,还是9.x的

    所以就选择自己配个pg10+postgis 2.4.1

     postgres

    postgres在dockerhub上的官方介绍不是太清楚,没有演示-v 

    我目前的主要需求是:

    db用镜像起容器

    数据内容保存在容器外

    启动db容器时,用-v把数据内容挂进去

    主要目的就是懒得安装db配参数,然后,db更新升级的时候别影响数据。

    yml这样写

    # Use postgres/example user/password credentials
    version: '3.1'
    
    services:
        db:
            image: postgres
            restart: always
            environment:
                POSTGRES_PASSWORD: example
            volumes:
                - /home/db/postgres:/var/lib/postgresql/data
    
        adminer:
            image: adminer
            restart: always
            ports:
                - 8080:8080

    /home/db/postgres是自己随便写的。可以事先不存在。

    放在/home,是因为装系统的时候/home为独立分区,重装系统的时候只要挂载点选上home,就完全保留数据。

    然后用adminer 登录数据库。用户名用 postgres 密码是 example  Database是postgres 

     server对应的是docker-compose.yml里services:下面 用postgres镜像的名字,在这里是db。如果换成别的名字,就要注意修改!

    老实说,和pg的文档八字不合。先是没看懂dockerhub里各种乱七八糟的参数设置介绍(例子里用全局变量配了密码,可是不配用户名,莫名其妙啊);

    然后没看懂“Use postgres/example user/password” 这句话。直接写 user:postgres password:example,或者加个as “ use postgres/example as user/password”行吗?

    是我智力低, 脑抽了,还是他文档过于奇葩?

    反正主要是为了postgis也就忍了。

    PostGIS

    安装依赖项一堆,除去常见的gcc make g++,这些不算,gdal geos proj4 3件套是必装的,官网的各种版本依赖关系矩阵茫茫多啊。。。然后还有json-c什么的。

    实在懒得自己配了。直接参考github上docker-postgis, dockerhub地址

    只要把第一句pg版本从9.5改成10.0就OK了:优点,使用的linux是alpine,体积超小。但gdal,geos 都是用apk 安装的,看版本,在依赖关系矩阵里也还算比较新吧。

    只砍了一句,不知道postgis 2.4.1的 SHA256码是多少,砍了 

  • 相关阅读:
    获取经纬度 CLLocation
    获取手机 IP
    UIBeaierPath 与 CAShapeLayer
    导航栏转场动画CATransition
    UITextField输入限制/小数/首位等
    程序进入后台继续执行
    发送短信
    网络AFNetworking 3.1
    UIBezierPath
    CoreAnimation 核心动画 / CABasicAnimation/ CAKeyframeAnimation
  • 原文地址:https://www.cnblogs.com/xuanmanstein/p/7742647.html
Copyright © 2011-2022 走看看