第一次尝试,很多问题不懂,先这么记着,以后技术成长了再回来看看。
环境: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数据库,新增非常慢,目前还不知道怎么调优呢。