Postgresql вызывает "каталог данных имеет неправильное владение" при попытке использовать том
Я пытаюсь запустить 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.конф я:
data_directory = '/data/postgresql'
затем я запускаю свой контейнер postgresql таким образом:
docker run -d --name postgre --volumes-from postgresql_data lyapun/postgresql
И Я got:
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.
как справиться с этой проблемой? Я много гуглил, чтобы найти информацию об использовании postgresql с томами docker, но ничего не нашел.
спасибо!
3 ответов
Ok, похоже, я нашел обходной путь для этой проблемы.
вместо запуска 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"]
это работает!
вы должны установить владение каталогом / data / postgresql тому же пользователю, под которым вы используете свой двоичный файл postgresql. Например, в Ubuntu обычно postgres
пользователей.
затем вы должны использовать эту команду:
chown postgres.postgres /data/postgresql
лучший способ решить эту проблему, предполагая, что ваши изображения postgres называются "postgres" и что ваша резервная копия./резервный.тар:
во-первых, добавьте это в свой 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" && \
docker run -it --name data --volumes-from postgres busybox true && \
docker rm postgres && \
docker run -it --name postgres --volumes-from=data postgres
у вас нет проблем с разрешениями, так как архив извлекается пользователем postgres вашего образа postgres, поэтому он является владельцем извлеченных файлов. Затем можно создать резервную копию данных с помощью контейнера данных. Преимущество этого решения это то, что вы не chmod/chown каждый раз, когда вы запускаете изображение.