postgresql: dockerfile создает пользователя и базу данных из сценария точки входа - PullRequest
0 голосов
/ 24 марта 2019

У меня есть Dockerfile

COPY ./docker-entrypoint.sh /

RUN chmod +x /docker-entrypoint.sh

USER postgres

ENTRYPOINT ["/docker-entrypoint.sh"]

где docker-entrypoint.sh:

#!/bin/sh

# Before PostgreSQL can function correctly, the database cluster must be initialized:
initdb -D /var/lib/postgres/data


#start postgres server
/usr/bin/postgres -D /var/lib/postgres/data &


# create a user or role
psql -d postgres -c "CREATE USER someuser WITH PASSWORD 'jkhkjah';" 

# create database 

psql -d postgres -c "CREATE DATABASE dockertest OWNER 'someuser';"

Он не создает базы данных someuser и dockertest. как это сделать

1 Ответ

0 голосов
/ 26 марта 2019

Посмотрите на официальный образ postgresql докера

У него такой рабочий процесс:

  1. Выполните docker-entrypoint.sh
  2. Запустите postgresqlсервер

Так что вам нужно изменить ваш Dockerfile следующим образом:

COPY ./docker-entrypoint.sh /

RUN chmod +x /docker-entrypoint.sh

USER postgres

ENTRYPOINT ["/docker-entrypoint.sh"]

EXPOSE 5432
CMD ["postgres"]

И затем изменить ваш docker-entrypoint.sh так:

#!/bin/sh

# Before PostgreSQL can function correctly, the database cluster must be initialized:
initdb -D /var/lib/postgres/data

# internal start of server in order to allow set-up using psql-client
# does not listen on external TCP/IP and waits until start finishes
pg_ctl -D "/var/lib/postgres/data" -o "-c listen_addresses=''" -w start

# create a user or role
psql -d postgres -c "CREATE USER someuser WITH PASSWORD 'jkhkjah';" 

# create database 
psql -v ON_ERROR_STOP=1 -d postgres -c "CREATE DATABASE dockertest OWNER 'someuser';"

# stop internal postgres server
pg_ctl -v ON_ERROR_STOP=1 -D "/var/lib/postgres/data" -m fast -w stop

exec "$@"

Я думаю, что ваша основная ошибка - запуск postgresql в фоновом режиме

/usr/bin/postgres -D /var/lib/postgres/data &

и немедленное выполнение запросов перед запуском сервера.

Также я рекомендую добавить -v ON_ERROR_STOP=1 параметров в psql, чтобыпросмотреть подробную информацию и остановить процесс, если произошла ошибка

...