我运行了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
转储数据库。