Docker не распознает каталог данных Postgresql - PullRequest
0 голосов
/ 29 июня 2018

Я отчаянно пытаюсь получить Docker-проект, который я унаследовал и запускаю, и Docker не дает мне никаких проблем. При попытке запустить мои контейнеры я получаю следующую ошибку в моем контейнере Postgresql:

FATAL:  "/var/lib/postgresql/data" is not a valid data directory
DETAIL:  File "/var/lib/postgresql/data/PG_VERSION" does not contain valid data.
HINT:  You might need to initdb.

Проект представляет собой Rails-проект, в котором также используются контейнеры Redis, ElasticSearch и Sidekiq - все они загружаются нормально.

докер-compose.yml:

postgres:
  image: postgres:9.6.2
  environment:
    POSTGRES_USER: $PG_USER
    POSTGRES_PASSWORD: $PG_PASS
  ports:
    - '5432:5432'
  volumes:
    - postgres:/var/lib/postgresql/data

/var/lib/postgresql/data принадлежит пользователю postgres (как мне и следовало ожидать), и служба postgresql запускается и работает нормально.

Я попытался запустить initdb из каталога /usr/lib/postgresql/9.6/bin, а также из докера (из докера он, похоже, не сохраняется и даже не создает ничего ... если кто-нибудь знает, почему мне было бы интересно узнать)

Содержимое каталога /var/lib/postgresql/data:

drwxrwxrwx 19 postgres postgres  4096 Jun 28 20:41 .
drwxr-xr-x  5 postgres postgres  4096 Jun 28 20:41 ..
drwx------  5 postgres postgres  4096 Jun 28 20:41 base
drwx------  2 postgres postgres  4096 Jun 28 20:41 global
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_clog
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_commit_ts
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_dynshmem
-rw-------  1 postgres postgres  4468 Jun 28 20:41 pg_hba.conf
-rw-------  1 postgres postgres  1636 Jun 28 20:41 pg_ident.conf
drwx------  4 postgres postgres  4096 Jun 28 20:41 pg_logical
drwx------  4 postgres postgres  4096 Jun 28 20:41 pg_multixact
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_notify
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_replslot
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_serial
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_snapshots
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_stat
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_stat_tmp
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_subtrans
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_tblspc
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_twophase
-rw-------  1 postgres postgres     4 Jun 28 20:41 PG_VERSION
drwx------  3 postgres postgres  4096 Jun 28 20:41 pg_xlog
-rw-------  1 postgres postgres    88 Jun 28 20:41 postgresql.auto.conf
-rw-------  1 postgres postgres 22267 Jun 28 20:41 postgresql.conf  

PG_VERSION содержит 9,6

Любая помощь очень ценится.

Ответы [ 3 ]

0 голосов
/ 29 июня 2018

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

volumes:
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql

вот файл init.sql

CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;
0 голосов
/ 30 июля 2019

У меня была такая же проблема, я перезапустил Docker daemon и даже перезапустил машину, но не решил проблему.
Путь /var/lib/postgresql/data даже не был на ФС.

Примечание: При выполнении docker ps контейнер postgresql не отображался как работающий.

Решение (docker-compose):

  • Закрыть контейнер postgres:
    docker-compose -f <path_to_my_docker_compose_file.yaml> down postgres

  • Запустить postgres контейнер:
    docker-compose -f <path_to_my_docker_compose_file.yaml> -d up postgres

- Это добилось цели! -

Решение (докер):

docker stop <postgres_container>
docker start <postgres_container>

Еще одно решение, которое вы можете попробовать:
initdb <temporary_volum_folder>
Пример:
initdb /tmp/postgres
docker-compose -f <path_to_my_docker_compose_file.yaml> -d up postgres
или
initdb /tmp/postgres docker start <postgres_container>

Примечание:
В моем случае изображение postgres определено в файле docker-compose.yaml, и можно заметить, что я не определяю ни PG_DAT, ни PG_VERSION, и контейнер работает нормально.

  postgres:
    image: postgres:9.6.14
    container_name: postgres
    environment:
      POSTGRES_USER: 'pg12345678'
      POSTGRES_PASSWORD: 'pg12345678'
    ports:
      - "5432:5432"
0 голосов
/ 29 июня 2018

Так что, когда у вас есть postgres:/var/lib/postgresql/data, он собирается смонтировать /var/lib/postgresql/data на том данных докера, называемый postgres. Все тома данных Docker хранятся вместе в месте, которое зависит от операционной системы.

Попробуйте изменить его на ./postgres, чтобы он создал каталог с именем postgres относительно вашего рабочего каталога.

Поскольку источник меняется, он воссоздает базу данных, и я бы хотел исправить ошибку, которую вы видите. Если нет, то это может быть проблема с правами доступа на хосте os.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...