Docker启动PostgreSQL时创建多个数据库
1 前言
在文章《Docker启动PostgreSQL并推荐几款连接工具》中我们介绍如何通过Docker来启动PostgreSQL,但只有一个数据库,如果想要创建多个数据库在同一个Docker容器上怎么办呢?
2 两种方案
一种方案是把shell/sql脚本放入/docker-entrypoint-initdb.d/目录中,让容器启动的时候自动执行创建;另一种是通过shell脚本指定创建,本质是一样的。这里只介绍第一种。
把shell脚本或sql脚本放入指定目录,就会自动执行,两种脚本都可以。
shell脚本例子如下:
#!/bin/bash
set -e
set -u
function create_user_and_database() {
local database=$1
echo " Creating user and database '$database'"
psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
CREATE USER $database;
CREATE DATABASE $database;
GRANT ALL PRIVILEGES ON DATABASE $database TO $database;
EOSQL
}
if [ -n "$POSTGRES_MULTIPLE_DATABASES" ]; then
echo "Multiple database creation requested: $POSTGRES_MULTIPLE_DATABASES"
for db in $(echo $POSTGRES_MULTIPLE_DATABASES | tr ',' ' '); do
create_user_and_database $db
done
echo "Multiple databases created"
fi
sql脚本例子如下:
CREATE USER pkslowuser;
CREATE DATABASE logdata;
GRANT ALL PRIVILEGES ON DATABASE logdata TO pkslowuser;
CREATE DATABASE orderdata;
GRANT ALL PRIVILEGES ON DATABASE orderdata TO pkslowuser;
CREATE DATABASE userdata;
GRANT ALL PRIVILEGES ON DATABASE userdata TO pkslowuser;
3 打包启动
准备Dockerfile,把shell/sql脚本文件放入镜像中去:
FROM postgres:10
COPY src/main/resources/create-multiple-postgresql-databases.sh /docker-entrypoint-initdb.d/
COPY src/main/resources/create-multiple-postgresql-databases.sql /docker-entrypoint-initdb.d/
启动如下:
docker run -itd \
--name pkslow-postgres \
-e POSTGRES_MULTIPLE_DATABASES=db1,db2 \
-e POSTGRES_USER=pkslow \
-e POSTGRES_PASSWORD=pkslow \
-p 5432:5432 \
pkslow/postgresql-multiple-databases:1.0-SNAPSHOT
启动成功后,就会创建如下数据库:
db1,db2,
logdata,orderdata,userdata
4 总结
这是在开发测试阶段使用的方案,实际上把数据库放在容器中不是一个好的选择。
代码请查看:https://github.com/LarryDpk/pkslow-samples
Docker启动PostgreSQL时创建多个数据库的更多相关文章
- Docker 启动容器时,报错 WARNING:IPv4 forwarding is disabled. Networking will not work. 的解决办法
Centos 7 Docker 启动了一个web服务 但是启动时 报 WARNING: IPv4 forwarding is disabled. Networking will not work. 解 ...
- docker部署postgresql时,data目录不生效的问题探究
今天用docker部署postgresql,用的是官方的镜像.结果挂载完 /var/lib/postgresql/data目录后,和容器里的目录其实并没有挂载成功. 母机上的目录并没有成功挂载到容器里 ...
- docker - 启动container时出现 [warning] : ipv4 forwarding is disabled. networking will not work
起因 今天在一台新的centos宿主机上安装docker,由于关闭了iptables,在此之后启动container的时候会出现警告: WARNING: IPv4 forwarding is disa ...
- Spring:启动项目时加载数据库数据(总结)
在项目中需要启动程序时,要将数据库的用户信息表加载到内存中,找到一下几种方式. 1.实现ApplicationListener接口,重写onApplicationEvent方法,可以在项目启动的时候执 ...
- centos7下docker启动失败解决
docker启动失败解决 could not change group /var/run/docker.sock to docker: gr... not found 如果出现:Job for doc ...
- docker启动centos容器后如何用putty连接
在前面的文章中,我提到过,win10 docker启动容器时,只有配置了宿主机和docker容器的端口映射,外部应用才能访问到容器中的服务,比如映射到Nginx的80端口.现在我将宿主机的某个端口映射 ...
- 免安装PostgreSQL启动服务及创建数据库
安装环境windows7 64位系统 免安装版本postgresql-10.3-1-windows-x64-binaries ===================================== ...
- MacOS使用Docker创建MySQL主从数据库
一.拉取MySQL镜像 通过终端获取最新的MySQL镜像 docker pull mysql/mysql-server 二.创建MySQL数据库容器配置文件对应目录 我们在当前用户下创建一组目录,用来 ...
- sqlserver学习笔记(一)—— 登录本机sqlserver、启动和停止sqlserver服务、创建和删除数据库
(重要参考:51自学网——SQL Server数据库教程) 首先按照网上教程安装好sqlserver,打开登录 登录本机sqlserver:①. ②localhost ③127.0.0.1 启动和停止 ...
随机推荐
- 手把手教你部署验证freeswitch(避免踩坑)
前言:请各大网友尊重本人原创知识分享,谨记本人博客:南国以南i 介绍:freeswitch可集成ASR(语音识别)和TTS(文本转语音)创建智能电话机器人和用户通话,可用于问卷调查,自动催缴等业务,电 ...
- 通过LinkedHashMap实现LRU算法
一.基于LinkedHashMap源码分析 方法调用流程(这里只是以put方法位例) put() -> putVal() -> afterNodeInsertion() -> rem ...
- 利用Typora+PicGo+OSS+Git+Github/码云搭建个人云笔记
搭建个人云笔记 对于程序员来讲,使用markdown可以帮助我们快速地写作,书写出排版好看,颜值高的笔记,使用markdown来书写文档相比于使用word要简单快捷的多 市面上有很多markdown的 ...
- 文件不同 diff --brief XX YY
文件不同 diff --brief XX YY 文件不同 --哪些位置 diff -c XX YY 9.diff命令 diff命令用于比较多个文本文件的差异,格式为"diff [参数] 文件 ...
- shell基础之编译安装nginx
本节新学知识:if 判断语句 1 #!/bin/bash 2 #检查环境 3 SESTATE=`getenforce` 4 if [ $SESTATE != "Disabled" ...
- 细谈select函数(C语言) -(转自 piaojun_pj的专栏)
Select在Socket编程中还是比较重要的,可是对于初学Socket的人来说都不太爱用Select写程序,他们只是习惯写诸如connect.accept.recv或recvfrom这样的阻塞程序( ...
- java命令的本质逻辑揭秘
前言 在日常编码中,有了ide的支持,我们已经很少直接在命令行中直接执行java XXX命令去启动一个项目了.然而我们有没有想过,一个简单的java命令背后究竟做了些什么事情?让我们看下下面几个简单的 ...
- Archlinux zsh终端美化 powerlevel10k配置
环境 Arch Linux + KDE Plasma 安装zsh yay -S zsh 更改默认终端 chsh -s /bin/zsh 安装oh-my-zsh-git archlinuxcn源有打好的 ...
- Redis持久化锦囊在手,再也不会担心数据丢失了
大家好,我是小羽. Redis 的读写都是在内存中进行的,所以它的性能高.而当我们的服务器断开或者重启的时候,数据就会消失,那么我们该怎么解决这个问题呢? 其实 Redis 已经为我们提供了一种持久化 ...
- 实现不同VLAN间的通信(单臂路由和链路聚合)
单臂路由与链路聚合 1.单臂路由 1.1 链路类型 1.2 子接口 2. 链路捆绑 1.单臂路由 是指在路由器的一个接口上通过配置子接口,实现原来相互隔离的不同VLAN(虚拟局域网)之间的互联互通. ...