我正在编写一个微服务应用程序,它有一个用于 postgres 数据库的 docker 容器。我知道在将 SQL 转储到数据库时,我们在终端中使用此 docker 命令:
cat <dump sql file> | docker exec -i <container ID> psql -U <postgres username> <database name>
我想知道是否有类似的 linux 终端 docker 命令可以从容器外部运行到:
创建数据库命名
删除数据库命名
甚至:
请注意,我应该能够通过主机操作系统终端 (linux) 从容器外部运行 docker 命令。
任何建议将不胜感激。提前致谢。
MrE*_*MrE 24
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
不幸的是,您不能使用同一命令 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>;"
在你的问题所在的地方,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)
有点难看,但也可以使用一个衬垫:
\ndocker ps | grep postgres | awk \'{print $1}\'\nRun Code Online (Sandbox Code Playgroud)\ndocker exec -it $(docker ps | grep postgres | awk \'{print $1}\') psql -U postgres -d postgres -\xd1\x81 $command\nRun Code Online (Sandbox Code Playgroud)\nfor command in \'delete dbname\' \'create dbname\'; do echo $command; done\nRun Code Online (Sandbox Code Playgroud)\nfor 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\nRun Code Online (Sandbox Code Playgroud)\nPS“metrics”-数据库名称只是一个示例,您应该使用您的:)
\n| 归档时间: |
|
| 查看次数: |
25373 次 |
| 最近记录: |