Подожди сервис postgres запусти dockerfile - PullRequest
0 голосов
/ 06 ноября 2019

Я использую файл Docker для сборки образа Ubuntu, установив postgresql. Но я не могу дождаться статуса службы postgres. OK

FROM ubuntu:18.04
....
RUN apt-get update && apt-get install -y postgresql-11
RUN service postgresql start
RUN su postgres
RUN psql
RUN CREATE USER kong; CREATE DATABASE kong OWNER kong;
RUN \q
RUN exit

Все выглядит нормально, но RUN su postgres выдаст ошибку, потому что служба postgresql еще не запущена после RUN service postgresql start. Как я могу это сделать?

1 Ответ

2 голосов
/ 06 ноября 2019

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

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