【Docker】windows-postgres

第一次尝试,很多问题不懂,先这么记着,以后技术成长了再回来看看。

环境:Windows(PowerShell)+Docker

1、编写Dockerfile文件

FROM postgres

#ENV POSTGRES_USER postgres
#ENV POSTGRES_PASSWORD postgres
#ENV POSTGRES_DB postgres
#COPY *.sql /docker-entrypoint-initdb.d/
#WORKDIR /sql/
#COPY flaskzlg.sql /sql
#COPY initdb.sh /docker-entrypoint-initdb.d/

ADD flaskzlg.sql /docker-entrypoint-initdb.d/

#WORKDIR /docker-entrypoint-initdb.d/
#RUN psql -U root -d postgres -f flaskzlg.sql

#CMD ["psql", "-U", "root", "-d", "postgres", "-f", "flaskzlg.sql"]

#EXPOSE 5432

PS:Dockerfile文件,build的时候虽然没有报错,镜像也看起来正常,run容器的时候也没有报错,但是docker ps中没有新建的容器,这个时候大概率是Dockerfile中的某一个命令有问题;

上面的 CMD RUN 都会导致容器起不起来。目前还不知道为什么。

上面的ENV设置了没有效果,psql执行会报错,CMD的方式执行也不行,换成initdb.sh也不行;

2、build镜像

docker build -f ./Dockerfile -t pg7 .

PS:先进入到Dockerfile所在目录

3、新建容器

docker run --name pg9002 -itd -p 9002:5432 -e POSTGRES_PASSWORD=123456 -e PGDATA=/data/ -e POSTGRES_USER=postgres -e POSTGRES_DB=postgres -v /var/lib/postgresql/oy_PostgreSQL_1.0.0_data:/var/lib/postgresql/data pg2

PS:-itd 后台运行,如果是-it 会占用shell  -e的几个参数设置了不生效,尝试了 docker create volume pgdata 然后 pgdata:XXXX,挂载不生效呢;

4、查看容器是否启动

docker container ls -a

docker ps

PS:停止容器 docker stop pg9002,删除容器 docker container rm pg9002,需要先stop再rm

5、进入容器

docker exec -it pg9002 bash

PS:-itd后台运行,-it就是保持bash运行

6、初始化数据库

cd  /docker-entrypoint-initdb.d/

root@acf2ed3331ff:/docker-entrypoint-initdb.d# psql -U root -d postgres -f flaskzlg.sql

PS:Dockerfile里面,不生效,只能手动初始化

7、使用root登录数据库shell

root@acf2ed3331ff:/docker-entrypoint-initdb.d# psql -U postgres -d postgres -W

PS:root账号没有密码,所以password:直接回车就行;

查看pg版本:select version(); 

查看数据库列表:l 

查看user:select * from user;

切换数据库:c postgres

修改root密码:alter user postgres with password '123'; 主要是方便外部访问;

新建postgres用户并授权:

create user postgres with password 'postgres';
GRANT ALL PRIVILEGES ON DATABASE postgres TO postgres;
GRANT ALL PRIVILEGES ON TABLE address TO postgres;
GRANT ALL PRIVILEGES ON TABLE users TO postgres;
GRANT ALL PRIVILEGES ON TABLE post TO postgres;

PS:比如新建sequence时,如果没有指定模式,必须使用root用户才能访问 postgres虽然有其他权限,但是新增数据时就会因为sequnce而新增失败,权限控制很重要;

退出:q , root用户 输入exit也行;

 本来想实现持久化的,也想实现build的时候就能够初始化,结果目标完全没有达成,尴尬至极。

遗留问题:本地使用Pycharm启动Flask项目,使用root账号链接pg9002数据库,新增非常慢,目前还不知道怎么调优呢。

原文地址:https://www.cnblogs.com/flydkPocketMagic/p/14934198.html