Выполнение запросов к контейнеру Postgres docker с помощью скрипта bash - PullRequest
1 голос
/ 01 апреля 2020

Я работаю с простой базой данных postgres и docker. В настоящее время у меня есть файл docker -compose, который создает нужный мне контейнер и загружает в файлы SQL. После загрузки этих данных я бы хотел выполнить простой запрос через скрипт bash, который я собираюсь использовать для некоторых базовых тестов c (т. Е. Подтвердить количество строк> 0, et c) Для начала я просто пытаюсь создать простой сценарий, который будет запускать и выводить количество строк (тогда я могу беспокоиться о проведении реального тестирования). Вот что у меня есть:

docker -compose.yml:


services:
  postgres:
    image: postgres
    environment:
      POSTGRES_DB: test-db
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: postgres
    volumes:
    - ./database/create_table.sql:/docker-entrypoint-initdb.d/create_table.sql
    - ./databases/data.sql:/docker-entrypoint-initdb.d/data.sql
    - ./script/test.sh:/docker-entrypoint-initdb.d/test.sh

test. sh:

 #!/bin/bash

echo "Accessing bash terminal of DB container"
docker exec -it postgres_1 bash

echo "Accessing psql terminal"
psql -U postgres

echo "Connecting to database"
\c database

echo "Checking number of rows"
numrows = $("SELECT count(*) FROM my_table")

echo numrows + " found."

В настоящее время, когда я запускаю docker -compose, он создает данные из моего SQL файлы, а затем бездействует. Есть ли что-то еще, что мне нужно для запуска моего скрипта? Я могу сделать все это самостоятельно через отдельный терминал, но я хотел бы, чтобы все это было автоматизировано, чтобы я мог просто добавить тесты в свой тест . sh и затем запустите его, вместо того, чтобы делать это каждый раз вручную. Что мне здесь не хватает? Разве мой скрипт не должен работать, поскольку я действительно просто воссоздал команды, которые выполнял вручную? Спасибо за любую помощь!

1 Ответ

1 голос
/ 01 апреля 2020

К тому времени, как ваш скрипт bash выполняется, вы уже находитесь в самом контейнере postgres. Таким образом, вы можете просто запросить базу данных оттуда - как уже указывал @DavidMaze. Ваш скрипт может выглядеть следующим образом:

#!/bin/bash
db_name='test-db'
db_user='postgres'

function execute_sql() {
  psql --tuples-only -U $db_user -d $db_name -c "$@"
}

function log() {
  printf "Log [%s]: %s\n" "$(date --iso-8601=seconds)" "$*"
}

numrows=$(execute_sql "SELECT count(*) FROM my_table")

log "${numrows} rows found"

Вывод должен выглядеть примерно так:

postgres_1  | /usr/local/bin/docker-entrypoint.sh: sourcing /docker-entrypoint-initdb.d/test.sh
postgres_1  | [2020-03-31T23:02:14+00:00]:      4 rows found

Относительно тестирования: если вы хотите только выполнить SQL запросов и не делать Для выполнения / необходимости дополнительных сценариев вы можете просто поместить свои SQL тестовые запросы в файл. sql (например, test.sql).

Еще одна важная вещь, о которой стоит упомянуть - что, я уверен, вы уже известно: файлы (*. sql, *. sh et c.), которые вы монтируете в контейнер postgres, выполняются в алфавитном порядке, то есть

  1. create_table. sql
  2. данные. sql
  3. тест. sh

Итак, вы хороши.

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