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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM