繁体   English   中英

在 docker 容器中使用 postgres 数据库的 bash 脚本

[英]bash script to have a postgres DB in a docker container

我在使用这个 bash 脚本创建 Postgres 数据库时遇到了问题:

#! /bin/bash

docker pull postgres
docker run --name coverage-postgres -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres 

export CONTAINER_ID=$(sudo docker ps -a | grep coverage-postgres | head -c12)

sleep 2s
sudo docker exec -it $CONTAINER_ID psql -U postgres -c "create user coverage_user with password 'password';"
sleep 0.5
sudo docker exec -it $CONTAINER_ID psql -U postgres -c "create database coverage owner coverage_user;"
sleep 0.5
sudo docker exec -it $CONTAINER_ID psql -U postgres -c "grant all privileges on database coverage to coverage_user;"
sleep 0.5
sudo docker exec -it $CONTAINER_ID psql -U postgres -c "\c coverage coverage_user" # it seems useless...
sleep 0.5
sudo docker exec -it $CONTAINER_ID psql -U postgres -c "CREATE TABLE IF NOT EXISTS postal_codes (id,...;"
sleep 0.5
sudo docker exec -it $CONTAINER_ID psql -U postgres -c "CREATE UNIQUE INDEX ... ;"

# exit from container
exit
# restart container
docker start $CONTAINER_ID

特别是,创建了数据库,创建了用户,创建了表,但是……它不在coverage db 中,而是在postgres db 中

我试图添加“CREATE TABLEcoverage.postal_codes”,但coverage是一个数据库而不是一个模式,它没有用。

我尝试使用: psql -Ucoverage_user但系统告诉我数据库coverage_user不存在

所以当然我想“我当然必须指定数据库!”。 然后我尝试使用: psql -U coverage作为数据库的名称,但这一次,系统取笑我,并改变主意,告诉我角色覆盖不存在

我尝试了一种解决方法:在命令 -c "\\c coveragecoverage_user" 中,我以这种方式连接了其他命令:

-c "\c coverage coverage_user; CREATE TABLE...; CREATE UNIQUE INDEX...;"

但是,当然,这都没有奏效。

我提出一个前提:我知道还有其他方法可以做到这一点,但我想了解这些特定命令缺少什么。

解决方案

#! /bin/bash

docker pull postgres
docker run --name coverage-postgres -e POSTGRES_PASSWORD=password -p 5432:5432 -d postgres 

export CONTAINER_ID=$(sudo docker ps -a | grep coverage-postgres | head -c12)

sleep 2s
docker exec -it $CONTAINER_ID psql -U postgres -c "create user coverage_user with password 'password';"
sleep 0.5
docker exec -it $CONTAINER_ID psql -U postgres -c "create database coverage owner coverage_user;"
sleep 0.5
docker exec -it $CONTAINER_ID psql -U postgres -c "grant all privileges on database coverage to coverage_user;"
sleep 0.5
docker exec -it $CONTAINER_ID psql -U coverage_user -c "CREATE TABLE IF NOT EXISTS postal_codes (id int)" coverage

解释

https://www.postgresql.org/docs/9.2/app-psql.html

psql [选项...] [dbname [用户名]]

只需在选项后添加dbname 并将用户更改为-U选项。 您也可以将dbname作为 rgument -d传递

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM