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

时间:2018-12-30 00:49:35

标签: 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. 的数据库
  3. 删除名为

  4. 的数据库

甚至:

  1. 删除一个表中的所有表以使其完全为空。

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

任何建议将不胜感激。预先感谢。

3 个答案:

答案 0 :(得分:1)

您的问题中有cat <dump sql file>的地方,您可以在标准输出上放置任何需要打印出SQL命令的内容;其中包括echo DROP DATABASE ...

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

此shell命令将在当前主机上运行的PostgreSQL实例上删除一个命名数据库;或者它不在当前主机或默认端口上,则可以set PGHOST and PGPORT environment variables

export PGHOST=localhost
# export PGUSER=<postgres username>
# export PGDATABASE=<database name>
echo "DROP DATABASE $1" | psql

答案 1 :(得分:1)

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

  1. 找出docker容器的id
docker ps | grep postgres | awk '{print $1}'
  1. 将其粘贴到上面帖子的命令中
docker exec -it $(docker ps | grep postgres | awk '{print $1}') psql -U postgres -d postgres -с $command
  1. 我们不能在同一个命令上删除和创建数据库,但我们可以在 bash 中使用 for 循环运行两次)
for command in 'delete dbname' 'create dbname'; do echo $command; done
  1. 最后让我们在一个 liner 中编译它:
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


PS 'metrics' - 数据库名称只是一个例子,你应该使用你的 :)

答案 2 :(得分:0)

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运行命令

不幸的是,您不能使用同一命令删除和创建数据库,但是您可以运行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>;"