Я хочу создать сценарий оболочки, который автоматизирует создание, запуск и создание базы данных в базе данных postgres с помощью докера.
Я хочу использовать официальный пакет docker postgres
для postgres в докере.
Я использую следующий сценарий:
docker network create --subnet=172.18.0.0/16 shared_network;
docker kill postgres_linker;
docker rm postgres_linker;
docker run --name postgres_linker -e POSTGRES_PASSWORD=blahblahblah -d --net shared_network --ip 172.18.0.2 postgres:10-alpine;
docker exec -it postgres_linker psql -U postgres -c "create database linker;";
Но когда я запускаю это, я получаю следующий результат без создания какой-либо базы данных:
Error response from daemon: network with name shared_network already exists
postgres_linker
postgres_linker
b2a9fd4d6e25b62d60adb05c8b6b653a1b55ec7a869c4728677d6289f5cddd63
psql: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
Первая строка этого журнала в порядке, вторая и третья тоже. Проблема в том, что psql
не запускает команду в контейнере postgres, хотя команда, которую я пытаюсь запустить, верна. Если я запустил последнюю команду отдельно от сценария оболочки:
docker exec -it postgres_linker psql -U postgres -c "create database linker;";
Это не дает мне ошибки! и это работает!
Почему происходит такое поведение?
Я нашел решение своей проблемы. К сожалению, я подумал, что когда контейнер postgres запущен, сервер сразу же запускается. Это было неправдой, и нужно время, чтобы понять это. поэтому мне нужно было добавить задержку. В результате файл сценария должен выглядеть так:
docker network create --subnet=172.18.0.0/16 shared_network;
docker kill postgres_linker;
docker rm postgres_linker;
docker run --name postgres_linker -e POSTGRES_PASSWORD=blahblahblah -d --net shared_network --ip 172.18.0.2 postgres:10-alpine;
sleep 5;
docker exec -it postgres_linker psql -U postgres -c "create database linker;";