#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