如何使用单个 docker 命令删除和重新创建 postgres 数据库?

ssh*_*270 8 postgresql docker

我正在编写一个微服务应用程序,它有一个用于 postgres 数据库的 docker 容器。我知道在将 SQL 转储到数据库时,我们在终端中使用此 docker 命令:

cat <dump sql file> | docker exec -i <container ID> psql -U <postgres username> <database name>

我想知道是否有类似的 linux 终端 docker 命令可以从容器外部运行到:

  1. 创建数据库命名

  2. 删除数据库命名

甚至:

  1. 删除所有表,使其在一个命令中完全清空。

请注意,我应该能够通过主机操作系统终端 (linux) 从容器外部运行 docker 命令。

任何建议将不胜感激。提前致谢。

MrE*_*MrE 24

Postgres 存储是容器本地的吗?如果是这样,那么删除容器并重新创建它会重置您的数据库本身。如果您的数据是从本地或网络文件夹挂载的,则重置它意味着在其上运行命令psql

您有多种选择:

  • 带壳进入容器

docker exec -it <container-id> /bin/sh

然后运行 ​​psql 并在 psql 命令行中执行任何您想要的操作。

  • 直接在docker中运行psql

docker exec -it <container-id> psql -U <username> -d <database-name>

  • 在本地安装 psql 并运行它以访问 docker 中的 postgres 实例

psql -U <username> -h localhost

  • 使用 psql 运行命令

不幸的是,您不能使用同一命令 DROP 和 CREATE 数据库,但您可以运行 2 个单独的命令

docker exec -it <container-id> psql -U <username> -d postgres -c "DROP DATABASE <dbname>;"

docker exec -it <container-id> psql -U <username> -d postgres -c "CREATE DATABASE <dbname>;"

  • @sshussain270 请将接受的答案更改为:) ;) (5认同)

Dav*_*aze 5

在你的问题所在的地方,cat <dump sql file>你可以放置任何你想要的东西,在标准输出上打印出 SQL 命令;包括echo DROP DATABASE ...

请记住,您可以使用普通的 PostgreSQL 客户端与 PostgreSQL 服务器交互,无论它是否在 Docker 中运行。(这确实需要您在外部发布数据库端口,通常使用docker run -p5432:5432或类似选项。)您不需要主机上的根级别访问权限,也不需要数据库服务器上的根 shell,只需运行数据库命令即可。

此 shell 命令将删除当前主机上运行的 PostgreSQL 实例上的命名数据库;或者,如果它不在当前主机或默认端口上,您可以设置PGHOST环境PGPORT变量

export PGHOST=localhost
# export PGUSER=<postgres username>
# export PGDATABASE=<database name>
echo "DROP DATABASE $1" | psql
Run Code Online (Sandbox Code Playgroud)


dez*_*ezz 5

有点难看,但也可以使用一个衬垫:

\n
    \n
  1. 找出docker容器的id
  2. \n
\n
docker ps | grep postgres | awk \'{print $1}\'\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 将其粘贴到上面帖子中的命令中
  2. \n
\n
docker exec -it $(docker ps | grep postgres | awk \'{print $1}\') psql -U postgres -d postgres -\xd1\x81 $command\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 我们不能在同一个命令上删除和创建数据库,但我们可以使用 bash 中的 for 循环运行两次)
  2. \n
\n
for command in \'delete dbname\' \'create dbname\'; do echo $command; done\n
Run Code Online (Sandbox Code Playgroud)\n
    \n
  1. 最后让我们将其编译在一个行中:
  2. \n
\n
for command in \'drop database metrics;\' \'create database metrics;\'; do docker exec -it $(docker ps | grep postgres | awk \'{print $1}\') psql -U postgres -d postgres -c $command; done\n\n\n
Run Code Online (Sandbox Code Playgroud)\n

PS“metrics”-数据库名称只是一个示例,您应该使用您的:)

\n