У нас есть док-контейнер для шкалы времени, который явно использует слепое монтирование volume, настроенное следующим образом:
timescaledb:
restart: always
image: timescale/timescaledb:latest-pg11
user: root
container_name: timescaledb
logging:
driver: syslog
options:
syslog-address: "tcp://${DOCKER_HOST_IP}:5006"
tag: "{{.Name}}/{{.ID}}"
ports:
- 5432:5432
volumes:
- ./postgresql/postgresql.conf:/etc/postgresql/postgresql.conf
- /mnt/postgresql/data:/var/lib/postgresql/data
- /var/run/docker.sock:/var/run/docker.sock
environment:
- TIMESCALEDB_TELEMETRY=off
- POSTGRES_PASSWORD=*was there but removed*
command: postgres -c 'config_file=/etc/postgresql/postgresql.conf'
depends_on:
- logstash
поэтому обратите внимание на /mnt/postgresql/data:/var/lib/postgresql/data
здесь.
После обновления некоторых существующих строк я проверяю последний измененный файл на хосте в папке /mnt/postgresql/data
, используя подход отсюда: https://stackoverflow.com/a/7448828/1759063
find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head
И я не нашел там никаких последних обновлений файлов. Так где собственно хранятся данные шкалы времени и что собственно нам надо монтировать, чтобы не потерять данные на docker-compose down
и так далее?
Выход такой:
find $1 -type f -exec stat --format '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head
2020-10-12 00:33:25.027351283 +0000 ./data/pg_stat/global.tmp
2020-10-12 00:33:18.714856683 +0000 ./data/pg_stat_tmp/global.stat
2020-10-12 00:33:18.714856683 +0000 ./data/pg_stat_tmp/db_0.stat
2020-10-12 00:33:14.770545499 +0000 ./data/pg_stat_tmp/db_13117.stat
2020-10-12 00:01:09.337593127 +0000 ./data/pg_wal/00000001000000240000002A
2020-10-12 00:01:02.329038233 +0000 ./data/global/pg_control
2020-10-12 00:01:02.061017012 +0000 ./data/pg_logical/replorigin_checkpoint
2020-10-12 00:01:01.724990408 +0000 ./data/base/13117/18130
2020-10-12 00:01:01.436967605 +0000 ./data/pg_xact/0018
2020-10-11 23:59:16.664673521 +0000 ./data/pg_stat_tmp/pgss_query_texts.stat
Сегодня
date
Wed Oct 21 17:54:06 UTC 2020
Итак, каково фактическое место папки в контейнере, где хранились обновленные данные?
Самая интригующая часть заключается в том, что последние обновленные файлы в зависимости от того, как они наблюдаются внутри контейнера и с хоста в одной и той же папке (т.е. отображаются как слепое монтирование volume)
Из контейнера, глядя на сопоставленную папку:
find $1 -type f -exec stat -c '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head
2020-10-21 19:08:46.000000000 ./data/pg_stat_tmp/global.stat
2020-10-21 19:08:46.000000000 ./data/pg_stat_tmp/db_13117.stat
2020-10-21 19:08:46.000000000 ./data/pg_stat_tmp/db_0.stat
2020-10-21 12:51:21.000000000 ./data/pg_stat_tmp/pgss_query_texts.stat
2020-10-21 10:36:06.000000000 ./data/pg_wal/00000001000000080000001A
2020-10-21 10:36:00.000000000 ./data/pg_xact/0002
2020-10-21 10:36:00.000000000 ./data/pg_logical/replorigin_checkpoint
2020-10-21 10:36:00.000000000 ./data/global/pg_control
2020-10-21 10:36:00.000000000 ./data/base/13117/16539
2020-10-13 18:22:56.000000000 ./data/base/13117/50258
Та же папка с хоста:
:/mnt/postgresql/data# find $1 -type f -exec stat -c '%Y :%y %n' "{}" \; | sort -nr | cut -d: -f2- | head
2020-10-12 00:33:25.027351283 +0000 ./pg_stat/global.tmp
2020-10-12 00:33:18.714856683 +0000 ./pg_stat_tmp/global.stat
2020-10-12 00:33:18.714856683 +0000 ./pg_stat_tmp/db_0.stat
2020-10-12 00:33:14.770545499 +0000 ./pg_stat_tmp/db_13117.stat
2020-10-12 00:01:09.337593127 +0000 ./pg_wal/00000001000000240000002A
2020-10-12 00:01:02.329038233 +0000 ./global/pg_control
2020-10-12 00:01:02.061017012 +0000 ./pg_logical/replorigin_checkpoint
2020-10-12 00:01:01.724990408 +0000 ./base/13117/18130
2020-10-12 00:01:01.436967605 +0000 ./pg_xact/0018
2020-10-11 23:59:16.664673521 +0000 ./pg_stat_tmp/pgss_query_texts.stat
при попытке получить доступ к файлу, который был изменен в соответствии с контейнером докера по адресу 2020-10-21 19:08:46.000000000
, но, согласно хосту, он был изменен только неделей ранее:
:/mnt/postgresql/data# ls -l pg_stat_tmp/global.stat
-rw------- 1 70 70 607 Oct 12 00:33 pg_stat_tmp/global.stat
Может ли папка слепого монтирования volume содержать разные файлы в виде контейнера и хоста?
Необычность здесь только в том, что на том же докере у нас работает другой контейнер, а не слепое монтирование, а том с тем же Destination, что и у нас в слепом монтировании:
"Type": "volume",
> "Name": "9a241364bdb2c9f1f1ac5ce30effeca15d1c7477f7b99eec42acf40bee5e8ba2",
> "Source": "/var/lib/docker/volumes/9a241364bdb2c9f1f1ac5ce30effeca15d1c7477f7b99eec42acf40bee5e8ba2/_data",
> "Destination": "/var/lib/postgresql/data",
> "Driver": "local",
> "Mode": "",
> "RW": true,
> "Propagation": ""
> }
postgresql.conf
, не переопределять CMD, .. Может быть, вы также можете показатьpwd
перед списками файлов. - person TmTron   schedule 22.10.2020