基本循环

基本循环

我运行了docker system prune,忘记了我仍然想要其内容的某个 Postgres 数据库。

我认为我可能仍在 macOS 的 Docker 虚拟机中保留该卷。但是,我不知道它是哪一个,它们都看起来像:

✗ docker volume ls
DRIVER    VOLUME NAME
local     0bb96275a994e1eacafe016547a194d8f91580eb2b42e47897f4c90b48f7f92a
local     1a5adc7281788533e612b8c11cede2847aaf3f9819678322950ba4c199711481
local     1a6f07dd7a704731d0ad42e57a95d6ea136951c47de6e28aa3d2b8d8d891bf4f
local     2ad31cdc84c0e606e4535b1e22c9826fdf7cf21772cdb3c1604179aea6f861ff
[70 more volumes not listed]

我的问题:如何从我postgres:9.6-alpine用于应用程序的映像启动 Docker 容器,并让它使用其中一个卷来检查它是否是我要查找的卷?

数据库容器先前由 创建docker-compose。如果我可以使用 启动整个应用程序docker-compose并让数据库使用特定卷,我就能很快发现它是否正确。

答案1

基本循环

这个小小的 bash 循环将运行所有卷,将它们安装到临时容器中并打印其内容:

for vol in $(docker volume ls --format "{{.Name}}"); do \
  echo "$vol ======================================"; \
  docker run --rm -v $vol:/tmp debian:buster ls /tmp; \
  echo '------------------------------------------'; \
done

grep在循环中加入

为了简化对 70 卷的搜索,您可以grep在循环中添加命令,以便它仅打印与模式匹配的内容:

docker run --rm -v $vol:/tmp debian:buster ls /tmp | grep pg_; \

这样,您将只会看到pg_名称中包含的文件,这足以找到 Postgres 卷。

循环中与数据库交互

假设您仍有许多结果,并且需要检查数据库表以找到正确的卷,您可以执行以下操作:

docker run -v $vol:/var/lib/postgresql/data --rm -u postgres postgres:9.6-alpine bash -c 'source /docker-entrypoint.sh; docker_temp_server_start; psql -U postgres db -c "\d"; docker_temp_server_stop; exit'

这:

  • postgres:9.6-alpine创建基于附加卷的容器
  • 启动入口点脚本(启动 Postgres 引擎)
  • 运行psql命令列出数据库的表db

恢复卷

一旦找到正确的卷,就可以像这样启动 PostgreSQL 容器:

docker run -v volume_name:/var/lib/postgresql/data postgres:9.6-alpine

然后,您就可以按照通常的方式与其进行交互。例如,使用docker ps获取容器的名称,然后:

docker exec -i <name of container> pg_dump -U postgres -F c db > database.dump

转储数据库。

相关内容