/var/lib/postgresql/data данные папки слепого монтирования для временной шкалы в докере не обновляются, несмотря на явную вставку и обновление строк в нее

У нас есть док-контейнер для шкалы времени, который явно использует слепое монтирование 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": ""
>             }

person Ilya Yevlampiev    schedule 21.10.2020    source источник
comment
В принципе, ваши инструкции по монтированию кажутся нормальными. Это работает, когда вы не указываете дополнительные услуги? то есть не передавать postgresql.conf, не переопределять CMD, .. Может быть, вы также можете показать pwd перед списками файлов.   -  person TmTron    schedule 22.10.2020
comment
Хорошо позвольте мне проверить. Похоже, что хосты монтируются hdfs, поэтому может быть хост монтирует их позже, чем запускает докер? Теперь пытаюсь проверить эту идею   -  person Ilya Yevlampiev    schedule 22.10.2020


Ответы (1)


Вы можете получить информацию о расположении подключенного тома

$ docker inspect <container_name>

Из вывода вы можете получить "Source".

Эталонная папка содержит файлы из расположения /var/log соответствующего контейнера.

$ ls -lah /var/lib/docker/volumes/b2.....1a/_data

person Ashok    schedule 21.10.2020
comment
Точно. Так что для меня непонятно, почему не обновляются файлы из смонтированной папки. Как и на самом деле, БД записывает в какое-то внутреннее расположение файлов докеров и обновляет их, а не файлы в томе. Вопрос в том, что может быть альтернативным расположением в контейнере docker db timescale? - person Ilya Yevlampiev; 21.10.2020