При условии, что все файлы находятся там, где они должны быть, я полагаю, что единственная проблема с вашей установкой - это то, что вы пропустили фактический исполняемый файл из 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
из известного рабочего состояния.