Во-первых, каждая команда RUN в Dockerfile запускается в отдельной оболочке, и команда RUN
должна использоваться для установки или настройки, а не для starting
процесса. Процесс должен быть запущен в CMD
или entrypoint
.
RUN против CMD
Лучше использовать официальное postgress image docker .
docker run --name some-postgres -e POSTGRES_PASSWORD=mysecretpassword -d postgres
Пользователь и база данных postgres по умолчанию создаются в точке входа с помощью initdb. или вы можете построить свое изображение на основе postgress.
FROM postgres:11
ENV POSTGRES_USER=kong
ENV POSTGRES_PASSWORD=example
COPY seed.sql /docker-entrypoint-initdb.d/seed.sql
Это создаст изображение с пользователем, паролем, а также точка входа будет также вставлять начальные данные при запуске контейнера.
POSTGRES_USER
Эта необязательная переменная среды используется вместе с POSTGRES_PASSWORD для установки пользователя и его пароля. Эта переменная создаст указанного пользователя с полномочиями суперпользователя и базу данных с тем же именем. Если он не указан, будет использоваться пользователь postgres по умолчанию.
Некоторое преимущество при использовании официального образа докера
- Создание базы данных из ENV
- Создать пользователя БД из ENV
- Запустить контейнер с начальными данными
- Будет ждать запуска postgres и работы
Все, что вам нужно
# Use postgres/example user/password credentials
version: '3.1'
services:
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: example
Сценарии инициализации
Если вы хотите выполнить дополнительную инициализацию изображения, полученного из этого, добавьте один или несколько *.sql, *.sql.gz, or *.sh
сценариев в /docker-entrypoint-initdb.d
(создаваякаталог при необходимости). После того, как точка входа вызовет initdb для создания пользователя и базы данных postgres по умолчанию, она запустит любые файлы *.sql
, запустит любые исполняемые сценарии * .sh и найдет все неисполняемые сценарии *.sh
, найденные в этом каталоге, для дальнейшей инициализации дозапуск службы.