Yar*_*ron 13 postgresql docker-compose
我正在尝试在带有 docker 桌面的本地 Windows 机器上使用 postgres 创建一个简单的演示。
这是我的 yaml docker compose 文件,名为img.yaml:
version: '3.6'
services:
postgres-demo:
image: postgres:11.5-alpine
container_name: postgres-demo
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=Welcome
- POSTGRES_DB=conference_app
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
ports:
- 5432:5432
volumes:
- .:/var/lib/my_data
restart: always
Run Code Online (Sandbox Code Playgroud)
我正在使用以下命令运行它:
docker-compose -f img.yaml up
并获得以下输出:
Starting postgres-demo ... done
Attaching to postgres-demo
postgres-demo | 2020-02-12 17:07:46.487 UTC [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
postgres-demo | 2020-02-12 17:07:46.487 UTC [1] LOG: listening on IPv6 address "::", port 5432
postgres-demo | 2020-02-12 17:07:46.508 UTC [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
postgres-demo | 2020-02-12 17:07:46.543 UTC [18] LOG: database system was shut down at 2020-02-12 17:07:10 UTC
postgres-demo | 2020-02-12 17:07:46.556 UTC [1] LOG: database system is ready to accept connections
Run Code Online (Sandbox Code Playgroud)
然后,使用以下命令将 bash 打开到容器中:
docker exec -it d47056217a97 bash
我想查看容器中的数据库,所以我在 bash 中运行命令:
psql \dt
并得到错误:
psql: FATAL: role "root" does not exist。
尝试使用命令创建数据库:psql> create database conference_app;给出错误:psql: FATAL: role "conference_app" does not exist。
我很困惑。我究竟做错了什么?我的 yaml 缺少什么吗?
Raj*_*Raj 37
我user: postgres在 docker-compose 文件中指定了该服务。然后删除现有容器以在下一次执行时重新旋转它docker-compose up。容器提出了用户“postgres”,所以你只需psql -l要从那里开始(不需要 -U 标志)
这是我的 docker-compose 文件
version: '3.1'
services:
db:
image: postgres:12.6-alpine
restart: always
container_name: postgres12_6
user: postgres
environment:
- "POSTGRES_PASSWORD=postgres"
- "ES_JAVA_OPTS=-Xms1024m -Xmx3072m"
networks:
- esnet
adminer:
image: adminer
restart: always
ports:
- 8080:8080
networks:
esnet:
Run Code Online (Sandbox Code Playgroud)
小智 17
容器假设您正在尝试使用 root 用户(当前用户)连接到数据库,因为您没有在 docker exec 上指定用户和数据库名称。
以下应该有效:
docker exec -it <container_id/container_name> psql -U <user_name> <database_name>
docker exec -it d47056217a97 psql -U postgres conference_app
Run Code Online (Sandbox Code Playgroud)
Jaf*_*fer 17
如果您还指定了默认数据库以外的数据库,则还应该将其包含在pg_readycmd 中,例如:
healthcheck:
test: ["CMD-SHELL", "pg_isready -d db-name -U db-user"]
Run Code Online (Sandbox Code Playgroud)
在上面的代码片段中,我的数据库名称是db-name并使用用户db-user。POSTGRES_DB尽管还设置了&POSTGRES_USER环境变量,但我需要指定这一点。
ric*_*yen 16
如果您不指定PGUSER环境变量,那么psql将假定您要使用当前操作系统用户作为您的数据库用户名。在这种情况下,您以root操作系统用户身份使用,您将尝试以 身份登录root,但该用户在数据库中不存在。
你需要要么打电话psql -U postgres,要么su - Postgres先
另请参阅postgresql 文档
正如 richyen回答的那样,您需要设置PGUSER环境变量,即使您已经设置了该POSTGRES_USER变量。这仅仅是因为psql并且pg_isready是两个不同的(尽管相关)程序,它们具有不同的环境查找逻辑(一个查找POSTGRES_USER,另一个查找 \xe2\x80\x93 )PGUSER)。
services:\n db:\n image: postgres\n environment:\n POSTGRES_USER: me\n PGUSER: me\n healthcheck:\n test: pg_isready\nRun Code Online (Sandbox Code Playgroud)\n如果你只想依赖一个变量并且不想用你的数据库用户名“堵漏洞”,你可以将 的值POSTGRES_USER直接放在 healthchecktest命令中:
services:\n db:\n image: postgres\n environment:\n POSTGRES_USER: me\n healthcheck:\n test: pg_isready -U $$POSTGRES_USER\nRun Code Online (Sandbox Code Playgroud)\n注意 how$$POSTGRES_USER带有两个美元符号前缀;这是故意的。
之后,您可能还想-d db根据 Christopher Peisert 的回答添加选项。
正如richyen的回答所述,设置PGUSER环境变量。
注意:POSTGRES_USER单独使用是行不通的。
在这种情况下,X通常是环境变量的值PGUSER。
设置PGUSER环境变量后,修复了原来的错误,但引入了新的错误:
致命:数据库“X”不存在
修复方法是将数据库主机定义为其自己的 Docker 网络 IP 地址,如下所示:
services:
server:
depends_on:
db:
condition: service_healthy
db:
image: postgres:latest
healthcheck:
test: "pg_isready -h db"
interval: 3s
timeout: 5s
retries: 5
Run Code Online (Sandbox Code Playgroud)
这里-h db指的是db服务自己的Docker IP地址。使用此配置,通常不需要将附加标志传递给pg_isready.
| 归档时间: |
|
| 查看次数: |
15178 次 |
| 最近记录: |