【问题标题】:Cannot run or connect Portgresql container on Docker无法在 Docker 上运行或连接 Portgresql 容器
【发布时间】:2021-03-16 09:06:33
【问题描述】:

在我的 Windows 10 机器中,我有一个 Java 应用程序并使用以下配置在 Docker 上创建 Postgresql 图像:

docker-compose.yml:*

version: '2.0'

services:
  postgresql:
    image: postgres:11

    ports:
      - "5432:5432"
    expose:
      - "5432"
    environment:
      - POSTGRES_USER=demo
      - POSTGRES_PASSWORD=******
      - POSTGRES_DB=demo_test

我使用以下命令来合成图像:

cd postgresql
docker-compose up -d

虽然 pgadmin 容器在 Docker 上运行,但 postgres 容器通常处于重新启动状态,并且 sometines 似乎处于运行状态一秒钟。当我查看该容器日志时,我发现我遇到了以下错误:

2021-03-16 09:00:18.526 UTC [82] 致命:数据目录“/data/postgres”的所有权错误

2021-03-16 09:00:18.526 UTC [82] 提示:服务器必须由拥有数据目录的用户启动。

子进程以退出代码 1 退出

*initdb: 删除数据目录“/data/postgres”的内容

正在运行引导脚本...属于该数据库系统的文件将归用户“postgres”所有。 此用户还必须拥有服务器进程。

我已尝试应用几个解决方法建议,例如PostgreSQL with docker ownership issue,但它们都不起作用。那么,我该如何解决这个问题呢?

更新:这是我的docker-compoese.yml 文件的最后状态:

version: '2.0'

services:
  postgresql:
    image: postgres:11
    container_name: "my-pg"
    ports:
      - "5432:5432"
    expose:
      - "5432"
    environment:
      - POSTGRES_USER=demo
      - POSTGRES_PASSWORD=******
      - POSTGRES_DB=demo_test
    volumes:
      - psql:/var/lib/postgresql/data

volumes:
  psql:

【问题讨论】:

  • 您可以尝试使用命名卷,它还具有在两次重启之间保持数据库的附加效果。当然,docker 用户应该有权写入您用于这些卷的目录。
  • 同意,将数据目录放在容器外,并带有一个卷,指定的那个将不存在于容器中。
  • @Thomas 是的,但是怎么做?请问有什么例子吗?
  • @jr593 你同意什么? 为什么不发布您的建议作为答案?
  • "为什么不发布您的建议作为答案?" - 好吧,在某些情况下,这只是一个建议而不是答案,因此它可能不完整,甚至不是正确的轨道(即使我们没有明确的答案,我们也会努力提供帮助 - 至少我会这样做使用 cmets)。对我来说,“试试这个”不值得回答,因为它可能对您的情况有所帮助,也可能无济于事,而在您可能被误导或分心之后出现的其他情况。

标签: java windows postgresql docker docker-compose


【解决方案1】:

正如我在评论中已经说过的,我建议使用命名卷。

这是我用于 Postgres 12 的 docker-compose.yml:

version: "3"
services:
  postgres:
    image: "postgres:12"
    container_name: "my-pg"
    ports:
      - 5432:5432
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
      POSTGRES_DB: "mydb"
    volumes: 
      - psql:/var/lib/postgresql/data

volumes:
  psql:

然后我通过docker volume create psql 创建了psql 卷(所以只是一个没有任何实际路径映射的卷)。

【讨论】:

  • 非常感谢,我更新了我的docker-compoese.yml 文件,如我的问题中的更新所示。但是,问题仍然存在,我不确定是否可以使用 PowerShell 以管理员身份使用 docker volume create psql 命令创建卷。执行docker volume ls命令时,可以观察到psql卷。但不知道是什么问题?
  • 对我上一条评论有什么回复吗?
  • @zertuc 请不要不耐烦。我知道这可能会令人沮丧,但我也有自己的工作。 :) - 什么用户正在运行 docker?您是以管理员身份还是以其他用户身份安装 docker Desktop(afaik 是用于运行容器的用户)。如果是其他用户,您能否以该用户而不是管理员的身份创建卷?
  • 对不起,Thomas,是的,你是对的 :) 我不记得我使用了哪个用户,但通常我使用我的用户(即使我不使用管理员)已经是管理员权限。
  • 使用 ** 以该用户而不是管理员身份创建卷**,您的意思是由我的用户而不是管理员打开 PowerShell 吗?如果是这样,我尝试直接打开 PowerShell 或 cmd,但在他们的窗口左上角有一个指示符为“管理员:...”。所以,它似乎以管理员身份打开。但我也尝试通过这种方式创建音量,但没有任何改变。
猜你喜欢
  • 2020-09-28
  • 2021-07-02
  • 1970-01-01
  • 2020-06-21
  • 1970-01-01
  • 1970-01-01
  • 2019-07-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多