首页 > 解决方案 > 无法在新的 Docker 容器上登录 psql

问题描述

我将 Docker Compose 与Docker Hub 上的官方postgres 映像一起使用。运行后docker-compose up,我进入我的 PostgreSQL 容器并运行psql -U postgres。但是当我这样做时,我收到以下错误:

bash-5.1# psql -U postgres
psql: error: FATAL:  role "postgres" does not exist

这是我的相关部分docker-compose.yml

 ---
# Docker Compose 2.4 is for local development
# https://www.heroku.com/podcasts/codeish/57-discussing-docker-containers-and-kubernetes-with-a-docker-captain - Source on that.
version: '2.4'

services:
    postgres:
    image: postgres:13.1-alpine
    mem_limit: 256m
    volumes:
        - ./init.sql:/docker-entrypoint-initdb.d/init.sql
        - postgresql:/var/lib/postgresql/data:delegated
    ports:
        - "127.0.0.1:5432:5432"
    environment:
        PSQL_HISTFILE: /root/log/.psql_history
        POSTGRES_USER: my_app
        POSTGRES_PASSWORD: pgpassword
    restart: on-failure
    healthcheck:
        test: ["CMD-SHELL", "pg_isready -U postgres"]
        interval: 10s
        timeout: 2s
        retries: 10
    logging:
        driver: none

volumes:
    postgresql:
    storage:

为什么我的postgres用户没有被创建?

标签: postgresqldocker

解决方案


您将 postgres 超级用户定义为POSTGRES_USER: my_app(有关详细信息,请参阅dockerhub 上的自述文件),但尝试使用不存在的用户名postgres( ) 登录。psql -U postgres如果我们将其切换到my_app,它应该可以工作。健康检查也是如此。

或者,我们可以将 设置POSTGRES_USER为,例如,postgresroot(或任何我们想要的)并向容器的目录提供初始化脚本/docker-entrypoint-initdb.d/。此文件夹中的所有*.sql脚本将在数据库启动时执行。一种常见的方法是将包含所有脚本的主机目录(例如,创建新角色、创建新数据库以及将新角色所有权赋予该数据库)到该容器目录。可以在我的这个 bitbucket 存储库中找到一个示例。我们可以只关注postgres容器和postgres目录,因为它们是重要的部分。


推荐阅读