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码是多少,砍了 

  • 相关阅读:
    73. Set Matrix Zeroes
    289. Game of Live
    212. Word Search II
    79. Word Search
    142. Linked List Cycle II
    141. Linked List Cycle
    287. Find the Duplicate Number
    260. Single Number III
    137. Single Number II
    Oracle EBS中有关Form的触发器的执行顺序
  • 原文地址:https://www.cnblogs.com/xuanmanstein/p/7742647.html
Copyright © 2011-2022 走看看