如何制造包含数据的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文件

在文件中定义导入的数据









阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sici1985/article/details/51672020
个人分类: docker
想对作者说点什么? 我来说一句

1 Docker tutorial

Docker tutorial

hukfei hukfei

2017-07-24 09:45:14

阅读数:245

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭