(三)用docker-compose部署postgres+ postgis
因?yàn)閜ostgres用docker鏡像安裝,所以host不需要安裝pg,只需要安裝客戶端
sudo apt-get install -y postgresql-clientpostgres+postGIS
使用https://github.com/appropriate/docker-postgis? 有各種版本組合,目前使用 pg11 + pGIS 2.5
把3個(gè)文件放到1個(gè)文件夾里我這里是./machines/postgis,因?yàn)檫€有別的dockerfile。讓docker-compose能找到
# Use postgres/example user/password credentials version: '3.7'services:postgis: #postgres+ postGIS 安裝 不塞入自己寫(xiě)的任何代碼!#image: mdillon/postgis? #圖省事可以直接用docker hub上的鏡像build: ./machines/postgisrestart: alwaysenvironment:POSTGRES_PASSWORD: examplevolumes:- data_pg:/var/lib/postgresql/dataports:- "5432:5432"networks:mynet:ipv4_address: '172.19.0.12'networks:mynet:ipam:driver: defaultconfig:- subnet: 172.19.0.0/16volumes:data_pg:driver_opts:type: none#device: ./commondevice: /home/XXX/data_pgo: bind ?小坑: volume 用bind本地文件夾的方式,一定要先手工創(chuàng)建出?/home/XXX/data_pg?來(lái)
然后, 一定要注意掛載進(jìn)去名字要一樣. 今年文曲化忌,很容易因?yàn)檫@些小問(wèn)題卡住
networks是為了手工指定IP地址,真正和pg有關(guān)的是把本地文件夾作為volumes 命名為data_pg 掛進(jìn)去,讓pg能找到,這樣數(shù)據(jù)保存在本地文件夾里。
暴露pg的默認(rèn)端口5432,用于pgadmin查看
?
----20190505發(fā)現(xiàn)的坑--------
啟動(dòng)sh腳本需要時(shí)間,? 多個(gè)服務(wù)的時(shí)候,或者原作者那樣直接docker run 不會(huì)有問(wèn)題
但是,如果docker-compose 只包含1個(gè)pg服務(wù)的時(shí)候, 直接entrypoint就退了!? 無(wú)論如何啟動(dòng)不好.
卡了1晚上.
不得不說(shuō),docker-compose 不是個(gè)適合定制初始化過(guò)程的工具.? ?服務(wù)間等待之類的都要依賴wait-for-it.sh,像這種只有1個(gè)服務(wù)的,反而問(wèn)題更大.有點(diǎn)垃圾.
主觀原因:還是不夠單一職責(zé),??
讓docker-compose只負(fù)責(zé)把實(shí)例啟動(dòng)起來(lái)
不要把初始化db這些工作,耦合進(jìn)容器啟動(dòng)中這個(gè)生命周期里來(lái),
應(yīng)該在啟動(dòng)后用別的方式搞定.
?
于是一咬牙.舍掉sh腳本
無(wú)非是用psql 連接pg 創(chuàng)建數(shù)據(jù)庫(kù)模板, 安裝postgis extention的語(yǔ)句.這些
實(shí)測(cè),完全可以用py通過(guò)pscopg2 搞定.
——果然,1小時(shí)搞定?
?
?
多說(shuō)幾句,dockerfile寫(xiě)的很精簡(jiǎn)
FROM postgres:12LABEL author xuqinghanENV POSTGIS_MAJOR 3ENV POSTGIS_VERSION 3.0.0+dfsg-2~exp1.pgdg100+1RUN 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考進(jìn)去, 就能在最后結(jié)尾時(shí)自動(dòng)當(dāng)成entrypoint 執(zhí)行
這樣,不需要顯式寫(xiě) ENTRYPOINT CMD
dockerhub官網(wǎng)直接有postgis鏡像,但是pg版本低,還是9.x的
所以就選擇自己配個(gè)pg10+postgis 2.4.1
?postgres
postgres在dockerhub上的官方介紹不是太清楚,沒(méi)有演示-v?
我目前的主要需求是:
db用鏡像起容器
數(shù)據(jù)內(nèi)容保存在容器外
啟動(dòng)db容器時(shí),用-v把數(shù)據(jù)內(nèi)容掛進(jìn)去
主要目的就是懶得安裝db配參數(shù),然后,db更新升級(jí)的時(shí)候別影響數(shù)據(jù)。
?
yml這樣寫(xiě)
# Use postgres/example user/password credentials version: '3.1'services:db:image: postgresrestart: alwaysenvironment:POSTGRES_PASSWORD: examplevolumes:- /home/db/postgres:/var/lib/postgresql/dataadminer:image: adminerrestart: alwaysports:- 8080:8080/home/db/postgres是自己隨便寫(xiě)的。可以事先不存在。
放在/home,是因?yàn)檠b系統(tǒng)的時(shí)候/home為獨(dú)立分區(qū),重裝系統(tǒng)的時(shí)候只要掛載點(diǎn)選上home,就完全保留數(shù)據(jù)。
?
然后用adminer 登錄數(shù)據(jù)庫(kù)。用戶名用 postgres 密碼是 example? Database是postgres?
?server對(duì)應(yīng)的是docker-compose.yml里services:下面 用postgres鏡像的名字,在這里是db。如果換成別的名字,就要注意修改!
?
老實(shí)說(shuō),和pg的文檔八字不合。先是沒(méi)看懂dockerhub里各種亂七八糟的參數(shù)設(shè)置介紹(例子里用全局變量配了密碼,可是不配用戶名,莫名其妙啊);
然后沒(méi)看懂“Use postgres/example user/password” 這句話。直接寫(xiě) user:postgres password:example,或者加個(gè)as “ use postgres/example?as?user/password”行嗎?
是我智力低, 腦抽了,還是他文檔過(guò)于奇葩?
反正主要是為了postgis也就忍了。
PostGIS
安裝依賴項(xiàng)一堆,除去常見(jiàn)的gcc make g++,這些不算,gdal geos proj4 3件套是必裝的,官網(wǎng)的各種版本依賴關(guān)系矩陣茫茫多啊。。。然后還有json-c什么的。
實(shí)在懶得自己配了。直接參考github上docker-postgis,?dockerhub地址
只要把第一句pg版本從9.5改成10.0就OK了:優(yōu)點(diǎn),使用的linux是alpine,體積超小。但gdal,geos 都是用apk 安裝的,看版本,在依賴關(guān)系矩陣?yán)镆策€算比較新吧。
?
只砍了一句,不知道postgis 2.4.1的 SHA256碼是多少,砍了?
總結(jié)
以上是生活随笔為你收集整理的(三)用docker-compose部署postgres+ postgis的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: (二)docker安装并持久化postg
- 下一篇: Django-RESTframework