Добавить пользовательское расположение конфигурации в образ Docker Postgres, сохранив его параметры доступа - PullRequest
0 голосов
/ 21 октября 2019

Я написал Dockerfile следующим образом:

FROM postgres:11.2-alpine
ADD ./db/postgresql.conf /etc/postgresql/postgresql.conf
CMD ["-c", "config_file=/etc/postgresql/postgresql.conf"]

Он просто добавляет настраиваемое местоположение конфигурации к общему образу Postgres.

Теперь у меня есть следующее docker-compose описание сервиса

db:
  build:
    context: .
    dockerfile: ./db/Dockerfile
  environment:
    POSTGRES_PASSWORD passwordhere
    POSTGRES_USER: user
    POSTGRES_DB: db_name
  ports:
    - 5432:5432
  volumes:
    - ./run/db-data:/var/lib/db/data

Проблема в том, что я больше не могу удаленно подключаться к БД с использованием этих учетных данных, если я добавляю эту опцию конфигурации. Без этой строки CMD она работает просто отлично.

Если я добавлю "postgres" в CMD, то получится тот же эффект, так как базовый сценарий добавляет его сам.

Ответы [ 2 ]

1 голос
/ 21 октября 2019

При условии, что все файлы находятся там, где они должны быть, я полагаю, что единственная проблема с вашей установкой - это то, что вы пропустили фактический исполняемый файл из CMD - указав только опцию. Вам нужно запустить postgres:

CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]

Это должно сработать!

РЕДАКТИРОВАТЬ в ответ на первый комментарий ОП ниже

Во-первых, я подтвердил, что поведение неизменить, находится ли postgres в CMD или нет. Это именно так, как вы сказали. Вперед!

Тогда я подумал, что должна быть проблема с конкретным postgresql.conf в использовании. Если бы мы могли просто выяснить, что это за файл по умолчанию ... оказывается, мы можем!

Как получить существующий файл postgres.conf из образа postgres

1. Создайте docker-compose.yml со следующим содержимым:

version: "3"

services:
  db:
    image: postgres:11.2-alpine
    environment:
      - POSTGRES_PASSWORD=passwordhere
      - POSTGRES_USER=user
      - POSTGRES_DB=db_name
    ports:
      - 5432:5432
    volumes:
      - ./run/db-data:/var/lib/db/data

2. Раскрутите сервис, используя

$ docker-compose run --rm --name=postgres db

3. В другом терминале получите местоположение файла, используемого в этом выпуске:

$ docker exec -it postgres psql --dbname=db_name --username=user --command="SHOW config_file"
               config_file
------------------------------------------
 /var/lib/postgresql/data/postgresql.conf
(1 row)

4. Просмотр содержимого по умолчанию postgresql.conf

$ docker exec -it postgres cat /var/lib/postgresql/data/postgresql.conf

5. Замените локальный файл конфигурации

Теперь все, что нам нужно сделать, - это заменить локальный файл конфигурации ./db/postgresql.conf содержимым конфигурации с известным рабочим состоянием и изменить его при необходимости.

Объекты базы данныхсоздаются только один раз!

Объекты базы данных создаются только один раз контейнером postgres ( source ). Поэтому при разработке параметров базы данных мы должны удалить их, чтобы убедиться, что мы находимся в чистом состоянии.

Вот вариант ядерного (будьте осторожны!) для
(1)удалить все вышедшие контейнеры Docker, а затем
(2) удалить все тома Docker, не присоединенные к контейнерам:

$ docker rm $(docker ps -a -q) -f && docker volume prune -f

Так что теперь мы можем быть уверены, что стартуем из чистого состояния!

Окончательная настройка

Давайте вернем наш Dockerfile обратно на картинку (точно так же, как вы задали вопрос).

docker-compose.yml

version: "3"

services:
  db:
    build:
      context: .
      dockerfile: ./db/Dockerfile
    environment:
      - POSTGRES_PASSWORD=passwordhere
      - POSTGRES_USER=user
      - POSTGRES_DB=db_name
    ports:
      - 5432:5432
    volumes:
      - ./run/db-data:/var/lib/db/data

Подключитесь кdb

Теперь все, что нам нужно сделать, это построить из чистого состояния.

# ensure all volumes are deleted (see above)
$ docker-compose build
$ docker-compose run --rm --name=postgres db

Теперь мы можем (все еще) подключиться к базе данных:

$ docker exec -it postgres psql --dbname=db_name --username=user --command="SELECT COUNT(1) FROM pg_database WHERE datname='db_name'"

Наконецмы можем отредактировать postgres.conf из известного рабочего состояния.

0 голосов
/ 21 октября 2019

Согласно этому другому обсуждению , ваша команда CMD имеет только аргументы и пропускает команду. Попробуйте:

CMD ["postgres", "-c", "config_file=/etc/postgresql/postgresql.conf"]

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