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 каждый раз, когда вы запускаете изображение.