Я создаю базу данных PostgreSQL с помощью Docker Compose в Debian 11.
Docker version 20.10.14, build a224086Docker Compose version v2.3.3Когда я пытаюсь выключить Docker Compose и удалить все существующие данные, я не могу избавиться от привязанных данных.
докер-compose.yml
version: '3'
services:
postgres:
image: postgres:9.3.25
healthcheck:
test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ]
timeout: 45s
interval: 10s
retries: 10
restart: always
environment:
- POSTGRES_USER=root
- POSTGRES_PASSWORD=docker
- APP_DB_USER=app_user
- APP_DB_PASS=docker
- APP_DB_NAME=myapp_db
# Notice this creates bind mounts, not volumes!
volumes:
- ./db-entry-point:/docker-entrypoint-initdb.d/
- ./postgres-db-data:/var/lib/postgresql/data
ports:
- 5432:5432
Приведенная ниже команда выдается для выключения контейнеров докеров. Я знаю, что по умолчанию тома не удаляются. Аргумент --volumes можно использовать для удаления томов, но я проверил, что он не удаляет данные привязки.
docker compose -f /opt/storage/disk-03/docker/myapp-db/docker-compose.yml down
Эти файлы находятся в целевом каталоге монтирования привязки:
ls -la /opt/storage/disk-03/docker/myapp-db/postgres-db-data/
total 44
drwx------ 15 systemd-timesync root 329 Mar 29 09:52 .
drwxr-xr-x 4 root root 78 Mar 29 09:35 ..
-rw------- 1 systemd-timesync systemd-timesync 4 Mar 28 14:52 PG_VERSION
drwx------ 7 systemd-timesync systemd-timesync 67 Mar 28 14:52 base
drwx------ 2 systemd-timesync systemd-timesync 4096 Mar 29 09:51 global
drwx------ 2 systemd-timesync systemd-timesync 18 Mar 28 14:52 pg_clog
-rw------- 1 systemd-timesync systemd-timesync 4486 Mar 28 14:52 pg_hba.conf
-rw------- 1 systemd-timesync systemd-timesync 1636 Mar 28 14:52 pg_ident.conf
drwx------ 4 systemd-timesync systemd-timesync 36 Mar 28 14:52 pg_multixact
drwx------ 2 systemd-timesync systemd-timesync 18 Mar 29 09:50 pg_notify
drwx------ 2 systemd-timesync systemd-timesync 6 Mar 28 14:52 pg_serial
drwx------ 2 systemd-timesync systemd-timesync 6 Mar 28 14:52 pg_snapshots
drwx------ 2 systemd-timesync systemd-timesync 105 Mar 29 09:52 pg_stat
drwx------ 2 systemd-timesync systemd-timesync 6 Mar 29 09:52 pg_stat_tmp
drwx------ 2 systemd-timesync systemd-timesync 18 Mar 28 14:52 pg_subtrans
drwx------ 2 systemd-timesync systemd-timesync 6 Mar 28 14:52 pg_tblspc
drwx------ 2 systemd-timesync systemd-timesync 6 Mar 28 14:52 pg_twophase
drwx------ 3 systemd-timesync systemd-timesync 60 Mar 28 14:52 pg_xlog
-rw------- 1 systemd-timesync systemd-timesync 20120 Mar 28 14:52 postgresql.conf
-rw------- 1 systemd-timesync systemd-timesync 37 Mar 29 09:50 postmaster.opts
Я не знаю, как удалить эти файлы, так как rm -rf не удаляет их. ls -la /opt/storage/disk-03/docker/myapp-db/postgres-db-data/ по-прежнему перечисляет файлы.
sudo rm -rf /opt/storage/disk-03/docker/myapp-db/postgres-db-data/*
Как правильно с точки зрения Докера удалить эти файлы?
Ах да, имеет смысл, что скрипты инициализации не удаляются.





Кажется, что файлы можно удалить, сначала изменив владельца файлов, а затем удалив их. Я не уверен, что происходит в базовой ОС, но я проверял это пару раз, и это работает.
# This doesn't remove the files when files are owned by "systemd-timesync"
sudo rm -rf /opt/storage/disk-03/docker/myapp-db/postgres-db-data/*
# chown to admin user
sudo chown -R admin. /opt/storage/disk-03/docker/myapp-db/postgres-db-data/
# Now removal works
sudo rm -rf /opt/storage/disk-03/docker/myapp-db/postgres-db-data/*
/bin/rmдолжно быть правильно; Docker не будет вносить никаких изменений в смонтированные файлы хоста. (Обратите внимание, что Docker не различает сценарии инициализации, которые вы не хотите удалять, от хранилища базы данных, которое вы делаете; оба монтируют некоторый путь хоста в контейнер по некоторому пути.)