Postgresql выдает сообщение «каталог данных имеет неправильного владельца» при попытке использовать volume

#postgresql #docker

#postgresql #docker

Вопрос:

Я пытаюсь запустить postgresql в контейнере docker, но, конечно, мне нужно, чтобы данные моей базы данных были постоянными, поэтому я пытаюсь использовать контейнер только для данных, который предоставляет том для хранения базы данных в этом месте.

Итак, в моем контейнере данных есть такой Dockerfile:

 FROM ubuntu

# Create data directory
RUN mkdir -p /data/postgresql

# Create /data volume
VOLUME /data/postgresql
  

Который я запускаю:

 docker run --name postgresql_data lyapun/postgresql_data true
  

В моем postgresql.conf я установил:

 data_directory = '/data/postgresql'
  

Затем я запускаю свой контейнер postgresql таким образом:

 docker run -d --name postgre --volumes-from postgresql_data lyapun/postgresql
  

И я получил:

 2014-07-04 07:45:57 GMT FATAL:  data directory "/data/postgresql" has wrong ownership
2014-07-04 07:45:57 GMT HINT:  The server must be started by the user that owns the data directory.
  

Как справиться с этой проблемой? Я много искал в Google информацию об использовании postgresql с томами docker, но ничего не нашел.

Спасибо!

Комментарии:

1. Как вы запускаете postgres?

2. CMD [«/usr/lib/postgresql/9.1/bin/postgres», «-D», «/var/ lib/postgresql/9.1/main», «-c», «config_file=/etc/postgresql/9.1/main/postgresql.conf»]

3. Вы используете это как пользователь, postgres ?

4. да. ПОЛЬЗОВАТЕЛЬ postgres ПРЕДОСТАВЛЯЕТ 5432 CMD [«/usr/lib/postgresql/9.1/bin/postgres», «-D», «/var/ lib/postgresql/9.1/main», «-c», «config_file=/etc/postgresql/9.1/main/postgresql.conf»]

5. В моем случае каталог данных был смонтирован на внешнем жестком диске. Формат файла на внешнем жестком диске отличался. Я начал указывать каталог монтирования в домашнем расположении, и это сработало.

Ответ №1:

Хорошо, похоже, я нашел обходной путь для этой проблемы.

Вместо запуска postgres таким образом:

 CMD ["/usr/lib/postgresql/9.1/bin/postgres", "-D", "/var/lib/postgresql/9.1/main", "-c", "config_file=/etc/postgresql/9.1/main/postgresql.conf"]
  

Я написал скрипт bash:

 chown -Rf postgres:postgres /data/postgresql
chmod -R 700 /data/postgresql
sudo -u postgres /usr/lib/postgresql/9.1/bin/postgres -D /var/lib/postgresql/9.1/main -c config_file=/etc/postgresql/9.1/main/postgresql.conf
  

И заменил CMD в образе postgresql на:

 CMD ["bash", "/run.sh"]
  

Это работает!

Комментарии:

1. Вы уверены? Я замечаю, что вы все еще используете /var/lib/postgresql/9.1/main в качестве папки данных, а не подключенный том /data/postgresql . Таким образом, данные все еще сохраняются в контейнере.

Ответ №2:

Вы должны установить право собственности на directory / data / postgresql для того же пользователя, под которым вы запускаете свой двоичный файл postgresql. Например, в Ubuntu обычно это postgres пользователь.

Затем вы должны использовать эту команду:

 chown postgres.postgres /data/postgresql
  

Комментарии:

1. В каком Dockerfile мне следует это сделать? Я пытался, и это не помогло

2. @lyapun честно говоря, я не знаю docker. Но я думаю, что вы можете сделать это при создании тома…

3. спасибо, но пользовательские postgres, созданные в контейнере, который предоставляет объем, будут отличаться от пользовательских postgres, созданных в контейнере postgresql.

4. @lyapun попробуйте запустить command id postgres в том же контейнере, что и вы postgresql в нем. Вы увидите числовые uid и gid. Затем используйте этот числовой uid / gid вместо postgres значений в chown команде.

Ответ №3:

Лучший способ решить эту проблему, предполагая, что ваши изображения postgres называются «postgres» и что ваша резервная копия ./backup.tar:

Сначала добавьте это в свой postgres Dockerfile:

 VOLUME  ["/etc/postgresql", "/var/log/postgresql", "/var/lib/postgresql"]
  

Затем запустите:

 docker run -it --name postgres -v $(pwd):/db postgres sh -c "tar xvf /db/backup.tar --no-overwrite-dir" amp;amp; 
docker run -it --name data --volumes-from postgres busybox true amp;amp; 
docker rm postgres amp;amp; 
docker run -it --name postgres --volumes-from=data postgres
  

У вас нет проблем с разрешениями, поскольку архив извлекается пользователем postgres вашего изображения postgres, поэтому он является владельцем извлеченных файлов.
Затем вы можете создать резервную копию своих данных с помощью контейнера данных. Преимущество этого решения в том, что вы не выполняете chmod / chown при каждом запуске образа.

Ответ №4:

Этот тип ошибок довольно распространен, когда вы связываете каталог NTFS с вашим контейнером docker. Каталоги NTFS не поддерживают управление доступом к файлам и каталогам ext3. Единственный способ заставить это работать — связать каталог с диска ext3 с вашим контейнером.

Я немного отчаялся, когда поиграл с контейнерами Apache / PHP со связыванием папки www. После того, как я разместил связанные файлы в файловой системе ext3, проблема исчезла.

Я опубликовал краткое руководство по Docker на youtube, возможно, это поможет понять эту проблему:https://www.youtube.com/watch?v=eS9O05TTFjM