我正在编写一个微服务应用程序,该应用程序具有一个用于postgres数据库的docker容器。我知道在将SQL转储到数据库时,我们在终端中使用以下docker命令:
cat <dump sql file> | docker exec -i <container ID> psql -U <postgres username> <database name>
我想知道是否可以从容器外部运行类似的linux终端docker命令:
创建名为
删除名为
甚至:
请注意,我应该能够通过主机OS终端(linux)从容器外部运行docker命令。
任何建议将不胜感激。预先感谢。
答案 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)
有点难看,但也可以使用一个衬垫:
docker ps | grep postgres | awk '{print $1}'
docker exec -it $(docker ps | grep postgres | awk '{print $1}') psql -U postgres -d postgres -с $command
for command in 'delete dbname' 'create dbname'; do echo $command; done
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 exec -it <container-id> psql -U <username> -d <database-name>
psql -U <username> -h localhost
不幸的是,您不能使用同一命令删除和创建数据库,但是您可以运行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>;"