Как использовать сценарий оболочки, чтобы узнать, существует ли таблица базы данных postgres - PullRequest
0 голосов
/ 06 апреля 2020

Мне нужно использовать точку входа, чтобы определить, доступна ли база данных и существует ли таблица.

Я использую следующую оболочку, чтобы определить, существует ли таблица

Часть Содержимое dockerfile

ENTRYPOINT ["bash","docker-entrypoint.sh"] 

Содержимое сценария оболочки

until PGPASSWORD=postgres psql -h "db" -U "postgres" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 1
done

# Prepare variables
TABLE=web_user
SQL_EXISTS=$(printf '\dt "%s"' "$TABLE")

# Credentials
USERNAME=postgres
PASSWORD=postgres
DATABASE=postgres

echo "Checking if table <$TABLE> exists ..."

# Check if table exists
PGPASSWORD="$PASSWORD" psql -h "db" -U $USERNAME -d $DATABASE -c "$SQL_EXISTS"
# using #!/bin/bash
if [[ $(PGPASSWORD="$PASSWORD" psql -h "db" -U $USERNAME -d $DATABASE -c "$SQL_EXISTS") ]]
then
    echo "Table exists ..."

else
    echo "Table not exists ..., init database"
    python3 manage.py makemigrations web
    python3 manage.py migrate
fi

db - это service name контейнера postgres в compose

Я хочу, чтобы контейнер запускался впервые, определите, что пользовательская таблица не существует, затем create a new database, а затем перезапустите контейнер, чтобы найти, что пользовательская таблица уже существует. существует without creating a new data table

Но когда я использую его на базовом образе Ubuntu16.04, он просто выводит table exists... при первом запуске контейнера

psql: FATAL:  the database system is starting up
Postgres is unavailable - sleeping
Checking if table <web_user> exists ...
No matching relations found.
Table exists ...

Но я ожидаю, что print table not exists..., the init database и последующие команды

Вывод с использованием базового изображения python alpine выглядит следующим образом

Checking if table <web_user> exists ...
Did not find any relation named ""web_user"".
Table not exists ..., init database
Migrations for 'web':

Разница заключается в следующем:
No matching relations found. основано на вывод ubuntu image,
Did not find any relation named ""web_user"". на основе вывода python:3.6.9-alpine image

Почему это не другая часть, которая идет?

Буду признателен, если вы подскажете, почему произошла эта ошибка и как ее исправить?

Ответы [ 2 ]

0 голосов
/ 07 апреля 2020

Кажется, я решил эту проблему, изменив base image с ubuntu16.04 на ubuntu 18.04. Но я не знаю, что вызывает это.

0 голосов
/ 07 апреля 2020

я предполагаю, что оператор if верен, потому что вы успешно подключаетесь к БД (и не имеет никакого отношения к тому, находит ли это соединение строку или нет)

как попробуйте это:

if [[ $(PGPASSWORD="$PASSWORD" psql -h "db" -U $USERNAME -d $DATABASE) ]]
then
  echo connection successful
  echo basing your previous if on:
  echo $(PGPASSWORD="$PASSWORD" psql -h "db" -U $USERNAME -d $DATABASE -c "$SQL_EXISTS")
fi
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...