首页 > 解决方案 > 如何在 postgres 容器中运行 shell 脚本以确定数据库是否为空,如果不是则导入备份 SQL 脚本

问题描述

我想将我的项目迁移到 vagrant vm,其中一部分是将数据库数据迁移到 vagrant,我使用 postgres 容器来保存数据,所以我将一个目录/var/lib.postgresql/和备份 SQL 脚本安装到其中/docker-entrypoint-initdb.d/以自动加载备份数据和数据坚持。

docker run --name test1 -v /postgresShellTest/:/docker-entrypoint-initdb.d/ -v /postData/:/var/lib/postgresql/ postgres:11.4

但是,这会导致在删除容器后每次创建容器时,备份 SQL 都会删除添加的数据。虽然可以not mount the backup SQL later,但这不是很方便。所以不知道能不能加上判断,如果项目有表,则不运行备份SQL,否则会初始化数据库。

我挂载了一个shell.sh /docker-entrypoint-initdb.d/,内容如下

BAK=/var/lib/postgresql/data/
if [ "`ls -A ${BAK}`" = "" ];
then 
    echo "${BAK} is empty"
    psql -h localhost -p 5432 -U postgres -d postgres < edgeai.sql
else
    echo "${BAK} is not empty"
fi

因为第一次挂载了一个空文件夹/var/lib/postgresql/data/,但是这个psql报告:could not connect to server: No such file or directory ....socket "/tmp/.s.PGSQL.5432"?

所以我想psql搜索表

psql -U postgres -d postgres -c 'SELECT * FROM mytable'

但报错psql: FATAL: database "SELECT * FROM my_table" does not exist

我不知道如何实现我的目标

如果你们能告诉我如何实现它,我将不胜感激

标签: sqlpostgresqlshelldockerdocker-compose

解决方案


推荐阅读