Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 无法在Docker上运行或连接Portgresql容器_Java_Windows_Postgresql_Docker_Docker Compose - Fatal编程技术网

Java 无法在Docker上运行或连接Portgresql容器

Java 无法在Docker上运行或连接Portgresql容器,java,windows,postgresql,docker,docker-compose,Java,Windows,Postgresql,Docker,Docker Compose,在我的Windows 10机器中,我有一个Java应用程序,并使用以下配置在Docker上创建Postgresql图像: docker compose.yml:* version: '2.0' services: postgresql: image: postgres:11 ports: - "5432:5432" expose: - "5432" environment: - P

在我的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容器通常处于重新启动状态,有些容器似乎处于运行状态一秒钟。当我查看该容器日志时,我发现我遇到了以下错误:

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”所有。 此用户还必须拥有服务器进程

我曾尝试应用一些变通建议,例如,但没有一个有效。那么,我如何解决这个问题呢

更新:这是我的
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-compose.yml,适用于Postgres 12:

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用户应该有权限写入您用于这些卷的目录。如果同意,请将数据目录放在包含卷的容器外部,指定的卷将不存在于容器中。@Thomas是的,但如何操作?有什么例子吗?@jr593你同意什么?为什么不将你的建议作为答案发布?“为什么不将你的建议作为答案发布?”-嗯,在某些情况下,它只是一个建议而不是答案,因此它可能不完整,甚至可能不是正确的轨道(即使我们没有确定的答案,我们也试图提供帮助-至少我会使用评论)。对我来说,“试试这个”不值得回答,因为它可能对你的情况有帮助,也可能对你之后的其他人没有帮助。非常感谢,我更新了我的
docker compoese.yml
文件,如我问题中的更新所示。但是,问题仍然存在,我不确定是否可以使用PowerShell作为管理员使用
docker volume create psql
命令创建卷。执行
docker volume ls
命令时,我可以观察psql卷。但我不知道问题出在哪里?请回答我最后的评论好吗?@zertuc请不要不耐烦。我知道这会令人沮丧,但我也有自己的工作哪个用户正在运行docker?您是否以管理员或其他用户的身份安装docker Desktop(afaik,即用于运行容器的用户)。如果它是另一个用户,您可以将卷创建为该用户而不是管理员吗?抱歉,Thomas,是的,您是对的:)我不记得使用了哪个用户,但通常我使用的用户(即使我没有使用管理员)已经是管理员权限。使用**将卷创建为该用户而不是管理员**,您的意思是由我的用户而不是管理员打开PowerShell吗?如果是这样的话,我试图直接打开PowerShell或cmd,但在他们的窗口左上角有一个指示符号“Administrator:…”。所以,它似乎是作为管理员打开的。但我也试图通过这种方式创建音量,但没有任何改变。