我想创建一个shell脚本,该脚本可以使用docker自动在postgres数据库中创建,运行和创建数据库。
我想将docker postgres
官方软件包用于docker中的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容器上运行该命令,尽管我尝试运行的命令是正确的。如果我从Shell脚本中单独运行最后一个命令:
docker exec -it postgres_linker psql -U postgres -c "create database linker;";
它不会给我错误!可以了!
为什么会发生这种情况?
答案 0 :(得分:1)
我找到了解决问题的方法。
不幸的是,我认为当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;";