如何制造包含数据的postgres镜像

可以在hub.docker.com中搜索最新的postgres镜像

但是使用这样的镜像建立的容器是不包含数据库数据的,即使在该容器中的数据库中导入数据,重启容器后数据也丢失了

那么如何制作包含数据的postgres镜像呢

可以参照https://hub.docker.com/_/postgres/

首先看https://github.com/docker-library/postgres/blob/b1831ce069d10b14be05b9ddf6823e3d18c62cee/9.6/Dockerfile

其Dockfile中定义了

ENTRYPOINT ["/docker-entrypoint.sh"]CMD ["postgres"]
   
entrypoint定义了容器启动时默认执行的脚本,不可以被覆盖

cmd 定义了容器启动时执行的命令,可以在执行docker run时指定的新命令覆盖

如果同时定义了entrypoint和cmd,那么就将cmd执行的内容作为参数传给entrypoint 脚本


所以postgres 容器启动时会将参数postgres传给/docker-entrypoint.sh,并运行这个脚本

看这个脚本,如果传入的参数是postgres(默认cmd中定义的就是postgres),其会

1.创建postgres数据库目录($PGDATA)  

2.执行initdb创建数据库eval "gosu postgres initdb $POSTGRES_INITDB_ARGS"

3.启动数据库:gosu postgres pg_ctl -D "$PGDATA"-o "-c listen_addresses='localhost'"-w start 

4.设置数据库:根据创建容器时传入的参数做一些设置密码,创建数据库database的操作   

修改pg_hba.conf,这样其他机器都可以访问这个数据库

{ echo; echo "host all all 0.0.0.0/0 $authMethod"; } >> "$PGDATA/pg_hba.conf"

5.依据/docker-entrypoint-initdb.d/*目录下的文件,执行特殊的操作                                                                 

for f in /docker-entrypoint-initdb.d/*; do                                           

case "$f" in                                                                 

*.sh)     echo "$0: running $f"; . "$f" ;;                           

*.sql)    echo "$0: running $f"; "${psql[@]}" < "$f"; echo ;;        

*.sql.gz) echo "$0: running $f"; gunzip -c "$f" | "${psql[@]}"; echo ;;

*)        echo "$0: ignoring $f" ;;   

6.关闭数据库  gosu postgres pg_ctl -D "$PGDATA" -m fast -w stop   

7.执行 exec gosu postgres "$@" 启动数据库 ,执行的实际上是  exec gosu postgres postgres

如果参数不是postgres   

exec "$@",执行传入的命令,不会做数据库的初始化操作

所以为了使用这个镜像创建容器时数据库已经初始化并且包含数据

那么可以在/docker-entrypoint-initdb.d/目录下新建sh文件或者sql文件

在文件中定义导入的数据









  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值