当前位置: 首页 > 知识库问答 >
问题:

Docker Compose postgres upgrade initdb:error:目录“/var/lib/postgresql/data”存在但不为空

李昱
2023-03-14

我用docker compose安装了postgres 11。我想把它升级到12,但尽管我已经删除了容器及其卷,但容器的状态显示为“正在重新启动”。

这是我的docker-compose文件

version: '3.5'
services:
  postgres:
    image: postgres:12
    environment:
      POSTGRES_HOST_AUTH_METHOD: "trust"
    ports:
    - "5432"
    restart: always
    volumes:
    - /etc/postgresql/12/postgresql.conf:/var/lib/postgresql/data/postgresql.conf
    - db_data:/var/lib/postgresql/data
volumes:
  db_data:

但是它不起作用,并且日志存在以下问题

2020-07-02T12:54:47.012973448Z The files belonging to this database system will be owned by user "postgres".
2020-07-02T12:54:47.013030445Z This user must also own the server process.
2020-07-02T12:54:47.013068962Z 
2020-07-02T12:54:47.013222608Z The database cluster will be initialized with locale "en_US.utf8".
2020-07-02T12:54:47.013261425Z The default database encoding has accordingly been set to "UTF8".
2020-07-02T12:54:47.013281815Z The default text search configuration will be set to "english".
2020-07-02T12:54:47.013293326Z 
2020-07-02T12:54:47.013303793Z Data page checksums are disabled.
2020-07-02T12:54:47.013313919Z 
2020-07-02T12:54:47.013450079Z initdb: error: directory "/var/lib/postgresql/data" exists but is not empty
2020-07-02T12:54:47.013487706Z If you want to create a new database system, either remove or empty
2020-07-02T12:54:47.013501126Z the directory "/var/lib/postgresql/data" or run initdb
2020-07-02T12:54:47.013512379Z with an argument other than "/var/lib/postgresql/data".

当容器不断重启时,我如何删除或清空这个/var/lib/postgresql/data?

先谢谢你

共有3个答案

徐嘉谊
2023-03-14

我今天遇到了同样的问题,我通过删除您的案例中的卷db_data的内容修复了这个问题

docker volume ls
docker volume inspect db_data <-- will show you the mountpoint

我转到目录(挂载点)ex: /path/data

cp data data.backup
cd data
rm -R *

并启动服务:

docker-compose up -d
慕宪
2023-03-14

我有这个问题,因为/var/lib/postgresql/data/postgresql.conf/var/lib/postgresql/data在docker容器中重叠在/var/lib/postgresql/

配置损坏的一个例子是:

version: "3.8"
services:
  db:
    image: "postgres:10"
    ports:
      - "5432:5432"
    volumes:
      - ./postgresql.conf:/var/lib/postgresql/data/postgresql.conf
      - ./pg-data:/var/lib/postgresql/data

为了避免这种情况,我告诉PostgreSQL在/etc/postgresql.conf中找到它的配置,这样重叠的卷就不会像这样发生:

version: "3.8"
services:
  db:
    image: "postgres:10"
    command: ["postgres", "-c", "config_file=/etc/postgresql.conf"]
    ports:
      - "5432:5432"
    volumes:
      - ./postgresql.conf:/etc/postgresql.conf
      - ./pg-data:/var/lib/postgresql/data

这与pmsoltani的建议类似,但我移动了postgresql的位置。conf文件而不是数据目录。

程俊健
2023-03-14

引用本期@yosifkit

该卷需要为空,或者是一个有效的已初始化 postgres 数据库,其中的文件PG_VERSION,以便可以跳过 init。

…如果其中有任何文件或文件夹,例如丢失的找到,它可能无法初始化。如果您想将文件保留在卷中(或无法控制),您可以调整PGDATA环境变量以指向其中的子目录,例如-e PGDATA=/var/lib/postgresql/data/db-files/

因此,我将PGDATA添加到撰写文件的环境部分以解决此问题(请注意末尾的some_name):

services:
  postgres:
    image: postgres:12
    environment:
      PGDATA: /var/lib/postgresql/data/some_name/
 类似资料:
  • 问题内容: 我对Jenkins安装有问题。到目前为止,我已经在不同的计算机和不同的平台(Win XP,Win 7,Ubuntu 11.04,Ubuntu 12.04,CentOS 6)上安装了很多次Jenkins,但一直没有问题。 现在,我必须在CentOS 5.8机器上安装Jenkins,我按照http://pkg.jenkins- ci.org/redhat/中 的步骤进行操作 一切似乎都还可

  • 我正在编写一个应用程序来自动构建和运行SQL查询。对于许多表,我的代码工作正常,但在某个表上,它会抛出以下异常: 已运行的查询如下所示: 这实际上是从列中返回非空值。 我不明白为什么在pgAdmin 4中出现“列不存在”错误。我可以看到有一个名为的模式,其中包含表,该表有一个名为的列。 既然所有的列、模式和表名都是由应用程序本身检索的,我不认为存在拼写或语义错误,那么为什么PostgreSQL会导

  • 问题内容: 使用mysqld_safe启动mysql服务器5.7.17时,发生以下错误。 如何解决? 问题答案: 在安装时未创建此目录似乎很奇怪-您是否在my.cfg中手动更改了套接字文件的路径? 您是否尝试过自己简单地创建此目录并重新启动服务?

  • 问题内容: 我正在编写一个用于自动构建和运行SQL查询的应用程序。对于许多表,我的代码工作正常,但在某些表上会抛出以下异常而卡住: 已运行的查询如下: 这实际上从该列返回非空值。 我不明白为什么在pgAdmin 4中 确实出现“列不存在”错误。我可以看到有一个名称包含该表的架构,并且该表具有一个按预期方式命名的列。 由于所有列,模式和表名均由应用程序本身检索,所以我认为没有拼写或语义错误,因此Po

  • 使用mysqld_safe启动mysql server 5.7.17时,出现以下错误occcours。 怎么修?

  • 需要您的帮助,我不明白为什么会出现以下错误,我不是专业的postgresql开发人员。。 正如你可以看到创建的函数,那么为什么函数不存在? 错误:函数logintry(未知,未知,带时区的时间戳,整数)不存在第1行:选择logintry('Jon.Jones88@gmail.com','_@kjhfdb987',...^HINT:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。SQL