我一直在尝试通过创建自定义用户和数据库来为开发postgres实例设置容器.我正在使用官方的postgres docker图像.在文档中,它指示您在/docker-entrypoint-initdb.d/文件夹中插入一个bash脚本,以使用任何自定义参数设置数据库.
su postgres -c "createuser -w -d -r -s docker"
su postgres -c "createdb -O docker docker"
Run Code Online (Sandbox Code Playgroud)
FROM library/postgres
RUN ["mkdir", "/docker-entrypoint-initdb.d"]
ADD make_db.sh /docker-entrypoint-initdb.d/
Run Code Online (Sandbox Code Playgroud)
我从docker logs -f db(db是我的容器名称)得到的错误是:
createuser:无法连接到数据库postgres:无法连接到服务器:没有这样的文件或目录
似乎/docker-entrypoint-initdb.d/在postgres启动之前正在执行文件夹内的命令.我的问题是,如何使用官方postgres容器以编程方式设置用户/数据库?有没有办法用脚本执行此操作?
我想在postgres图像中使用psql,以便在数据库上运行一些查询.但不幸的是,当我附加到postgres容器时,我得到了错误,找不到psql命令...
对我来说,如何在容器中运行postgre sql查询或命令是一个谜.
如何在postgres容器中运行psql命令?(我是Docker世界的新人)
我使用Ubuntu作为主机,我没有在主机上安装postgres,我使用postgres容器代替.
docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------
yiialkalmi_app_1 /bin/bash Exit 0
yiialkalmi_nginx_1 nginx -g daemon off; Up 443/tcp, 0.0.0.0:80->80/tcp
yiialkalmi_php_1 php-fpm Up 9000/tcp
yiialkalmi_postgres_1 /docker-entrypoint.sh postgres Up 5432/tcp
yiialkalmi_redis_1 docker-entrypoint.sh redis ... Up 6379/tcp
Run Code Online (Sandbox Code Playgroud)
这里的容器:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
315567db2dff yiialkalmi_nginx "nginx -g 'daemon off" 18 hours ago Up 3 hours 0.0.0.0:80->80/tcp, 443/tcp yiialkalmi_nginx_1
53577722df71 yiialkalmi_php "php-fpm" 18 hours ago Up 3 hours 9000/tcp yiialkalmi_php_1
40e39bd0329a postgres:latest "/docker-entrypoint.s" 18 …Run Code Online (Sandbox Code Playgroud) 我有一个postgres:9.5.6-alpine容器,另一个名为web的容器,必须链接到它.我想在启动后运行create_db.shpostgres容器中命名的脚本并执行docker-entrypoint.sh,以便创建数据库和用户并恢复备份.我docker-compose.yml(postgres部分):
postgres:
build: ./postgres
container_name: postgres
volumes:
- /shared_folder/postgresql:/var/lib/postgresql
ports:
- "5432:5432"
command: sh /home/create_db.sh
Run Code Online (Sandbox Code Playgroud)
内容create_db.sh是:
#!/bin/sh
psql -d template1 -U postgres
psql --command "CREATE USER user WITH PASSWORD 'userpassword';"
psql --command "CREATE DATABASE userdb;"
psql --command "GRANT ALL PRIVILEGES ON DATABASE userdb to user;"
psql --command "\q;"
psql -U user -d userdb -f /var/lib/postgresql/backup.sql
exit
Run Code Online (Sandbox Code Playgroud)
当我跑docker-compose build,然后docker-compose up我得到这个:
Attaching to postgres, web
postgres | psql: could not connect to …Run Code Online (Sandbox Code Playgroud) 众所周知,可以使用类似于以下命令的 docker 命令复制要在创建容器时执行的 init.sql 文件:COPY init.sql /docker-entrypoint-initdb.d/
让我们考虑使用一个非常简单的 create table postgresql 语句:
CREATE TABLE films (
code char(5) CONSTRAINT firstkey PRIMARY KEY,
title varchar(40) NOT NULL,
did integer NOT NULL,
date_prod date,
kind varchar(10),
len interval hour to minute
);
Run Code Online (Sandbox Code Playgroud)
问题是这个表是在哪里(在哪个数据库中)创建的?
但更重要的是如何设置当前工作数据库以准确指定我们正在使用哪个数据库?
不仅是这句话,还有后来的所有言论,而且还很多!