可以在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"] | |
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文件
在文件中定义导入的数据