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

pgadmin

用py写的pg GUI,安装在本地就可以了。就不创建虚环境了

参考https://linuxhint.com/install-pgadmin4-ubuntu/

安装依赖

$ sudo apt-get install build-essential libssl-dev libffi-dev libgmp3-dev \
virtualenv python-pip libpq-dev python-dev

确认当前是py版本:和pip安装的库路径

马上2020年1月, py2就不支持了. 所以确认一下都是py3.6.

python
from distutils.sysconfig import get_python_lib
print(get_python_lib())

我自己竟然发现默认版本是不知什么时候装的Anaconda3,

想卸载,官网https://docs.anaconda.com/anaconda/install/uninstall/  提示 卸载只能删除,2333

确认 pip是2的还是3的

进入文件夹

/usr/local/bin

看看,pip 是更像 pip2 还是更像pip3,否则pip了半天,还是运行不了

python2 到2020年就不支持了,确保pip 和python都指向系统自带的3.6

下载安装。

居然不发布到pip上,几个意思

wget https://ftp.postgresql.org/pub/pgadmin/pgadmin4/v4.16/pip/pgadmin4-4.16-py2.py3-none-any.whl --no-check-certificate

sudo -H pip3 install pgadmin4-4.16-py2.py3-none-any.whl

安装了一堆py库,净是老面孔,2333

如果出现

Cannot uninstall 'psutil'. It is a distutils installed project and thus we cannot accurately determine which files belong to it which would lead to only a partial uninstall.

sudo -H pip3 install pgadmin4-4.16-py2.py3-none-any.whl --ignore-installed

参考https://www.pgadmin.org/faq/#2

运行

sudo xed /usr/local/lib/python3./dist-packages/pgadmin4/config_distro.py

sudo xed /usr/local/lib/python3.7/site-packages/pgadmin4/config_distro.py

加入SERVER_MODE = False

然后再运行,不然必须输入email+pwd 烦。

sudo python3 /usr/local/lib/python3./dist-packages/pgadmin4/pgAdmin4.py 

python3.7 /usr/local/lib/python3.7/site-packages/pgadmin4/pgAdmin4.py

结果

OSError: [Errno ] Permission denied: '/var/lib/pgadmin'

参考:

https://stackoverflow.com/questions/46707935/oserror-errno-13-permission-denied-var-lib-pgadmin

sudo mkdir "/var/log/pgadmin"
sudo chmod a+wrx "/var/log/pgadmin" sudo mkdir "/var/lib/pgadmin"
sudo chmod a+wrx "/var/lib/pgadmin"

居然是用flask写的一个web! 访问默认网址http://127.0.0.1:5050/browser/#

有点意思

看见除了默认的postgres数据库之外, 已经创建出了1个template_postgis数据库,包含几个extention(dockerfile 安装时initdb-postgis.sh里定义)

至此,postgis安装成功!

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

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

用docker-compose部署postgres+ postgis的更多相关文章

  1. 使用Docker Compose部署基于Sentinel的高可用Redis集群

    使用Docker Compose部署基于Sentinel的高可用Redis集群 https://yq.aliyun.com/articles/57953 Docker系列之(五):使用Docker C ...

  2. Docker Compose 部署前后端分离应用

    部署前后端分离应用 容器化 Abp 应用 关于 Abp 应用的容器化,其实和普通的 ASP.NET Core 应用差不多,大家可以参考我此前的文章. 唯一需要注意的是:因为 Abp 解决方案中有多个项 ...

  3. Docker Compose部署项目到容器-基于Tomcat和mysql的项目yml配置文件代码

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  4. 在Windows Server 2019通过Docker Compose部署Asp.Net Core

    一.安装Docker Enterprise 安装文档是: https://docs.docker.com/install/windows/docker-ee/ 安装完成后,如下图 二.首先,拉取一个W ...

  5. 使用Docker Compose 部署Nexus后初次登录账号密码不正确,并且在nexus-data下没有admin,password

    场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  6. Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  7. Docker Compose部署Nexus3时的docker-compose,yml代码

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  8. Docker Compose部署GitLab服务,搭建自己的代码托管平台(图文教程)

    场景 Docker-Compose简介与Ubuntu Server 上安装Compose: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  9. 使用Docker Compose 部署Nexus后提示:Unable to create directory /nexus-data/instance

    场景 Ubuntu Server 上使用Docker Compose 部署Nexus(图文教程): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/ ...

  10. Docker Compose 部署 Redis 及原理讲解 | 懒人屋

    原文:Docker Compose 部署 Redis 及原理讲解 | 懒人屋 Docker Compose 部署 Redis 及原理讲解  4.4k  字    16  分钟    2019-10-1 ...

随机推荐

  1. pytorch入门与实践-2.2

    Tensor 1--本质上可以理解为具有不同维度的数组 2--支持的基本运算 |---创建Tensor:  x=t.tensor(x,y) x,y 表示数组的大小 , x=t.rand(x,y), x ...

  2. Codeforces 1132 - A/B/C/D/E/F - (Undone)

    链接:http://codeforces.com/contest/1132 A - Regular Bracket Sequence - [水] 题解:首先 "()" 这个的数量多 ...

  3. InnoDB中锁的查看

    Ⅰ. show engine innodb status\G 1.1 实力分析一波 锁介绍的那篇中已经提到了这个命令,现在我们开一个参数,更细致的分析一下这个命令 (root@localhost) [ ...

  4. Angular2 File Upload

    Angular2 File Upload Install Install the components npm install ng2-file-upload --save github: https ...

  5. centos7编译安装Python3所需要的库(模块)依赖

    在centos中编译安装python3环境,第三方的库 实战的编辑环境: 1.VMware虚拟机   2.centos7 依赖包经过百度搜集以及之前安装Python3报错搜集(centos7反反复复安 ...

  6. PTA地下迷宫探索

    地道战是在抗日战争时期,在华北平原上抗日军民利用地道打击日本侵略者的作战方式.地道网是房连房.街连街.村连村的地下工事,如下图所示. 我们在回顾前辈们艰苦卓绝的战争生活的同时,真心钦佩他们的聪明才智. ...

  7. (4.8)mysql备份还原——binlog查看工具之show binlog的使用

    (4.8)mysql备份还原——binlog查看工具之mysqlbinlog及show binlog的使用 关键词:show binlog,mysql binlog查看,二进制文件查看,binlog查 ...

  8. sql语句格式化数字(前面补0)

    将一个数字例如33,或1使用t-sql语句转换成033或001 以下是详细分析: .,)得到1000 . as varchar) 将1000转换类型 .,) 从右边取3个字符得到033 将1格式化同上 ...

  9. (转载)中文Appium API 文档

    该文档是Testerhome官方翻译的源地址:https://github.com/appium/appium/tree/master/docs/cn官方网站上的:http://appium.io/s ...

  10. java框架之SpringMVC(2)-补充及拦截器

    高级参数绑定 package com.zze.springmvc.web.controller; import org.springframework.stereotype.Controller; i ...