Подробности по проблеме
Поведение, наблюдаемое OP, определенно происходит из-за несоответствия UID / GID, учитывая, что спецификация
volumes:
- ./postgres-data:/var/lib/postgresql/data
(которую можно рассматривать как docker -создать эквивалент docker run -v "$PWD/postgres-data:/var/lib/postgresql/data" …
) bind-mounts папка $PWD/postgres-data
внутри контейнера, предоставляя доступ к его файлам как есть (включая метаданные владельца / группы).
Также, обратите внимание, что обработка метаданных владельца / группы между хостом и контейнерами основана только на цифрах c UID и GID , а не на именах владельцев и групп.
Для получения дополнительной информации о UID и GID в контексте Docker, см. также , что статья на Medium.
Обходные пути, если необходимо связывание,
Для полноты, несколько возможных решений обходного пути проблема несоответствия UID-привязки (включая самую простую проблему, которая заключается в изменении UID файлов :), описана в этом ответе на StackOverflow: Как заставить хост и контейнер читать / записывать те же файлы с Docker?
Другие решения
После комментария @ ParanoidPenguin вы можете использовать именованный том, который в основном состоит из:
Примечания:
docker run -v PATH1:PATH2 …
запускает привязку из PATH1
(хост) в PATH2
(контейнер), если и только если PATH1
является абсолютным (то есть начинается с /
) (например, -v "$PWD:$PWD"
является общей идиомой) docker run -v NAME:PATH2 …
монтирует объем NAME
до PATH2
(контейнер) тогда и только тогда, когда NAME
не содержит /
(то есть соответствует регулярному выражению [a-zA-Z0-9][a-zA-Z0-9_.-]
). - , даже если мы не запускаем
docker volume create foo
заранее, docker run -v foo:/data --rm -it debian
создаст именованный том foo
при необходимости. для заполнения файлов именованного тома (или, соответственно, их резервного копирования) вы можете использовать эфемерный контейнер изображения debian
, ubuntu
или около того, сочетая одновременно крепление и монтирование тома:
Добавление файла /home/user/bar.txt
в новый том foo
file1=/home/user/bar.txt # initial file
uid=2000 # target User-ID in the volume
gid=2000 # target Group-ID in the volume
docker pull debian
docker run -v "$file1:$file1:ro" -v foo:/data \
-e file1="$file1" -e uid="$uid" -e gid="$gid" \
--rm -it debian bash -exc \
'cp -v -- "$file1" /data/bar.txt && chown -v $uid:$gid /data/bar.txt'
docker volume ls
Резервное копирование тома foo
в архиве
date=$(date +'%Y%m%d_%H%M%S')
back="backup_$date.tar.gz"
destdir=/home/user/backup
mkdir -p "$destdir"
docker run -v foo:/data -v "$destdir:/backup" -e back="$back" \
--rm -it debian bash -exc 'tar cvzf "/backup/$back" /data'