Docker无法识别Postgresql数据目录

时间:2018-06-29 01:36:31

标签: postgresql docker

我拼命地尝试让我继承并运行的Docker项目开始运行,而Docker却给我带来了无尽的麻烦。尝试启动容器时,我的Postgresql容器出现以下错误:

FATAL:  "/var/lib/postgresql/data" is not a valid data directory
DETAIL:  File "/var/lib/postgresql/data/PG_VERSION" does not contain valid data.
HINT:  You might need to initdb.

该项目是一个使用Redis,ElasticSearch和Sidekiq容器的Rails项目-所有这些都可以很好地加载。

docker-compose.yml:

postgres:
  image: postgres:9.6.2
  environment:
    POSTGRES_USER: $PG_USER
    POSTGRES_PASSWORD: $PG_PASS
  ports:
    - '5432:5432'
  volumes:
    - postgres:/var/lib/postgresql/data

/var/lib/postgresql/data由postgres用户拥有(应该相信),并且postgresql服务可以启动并可以正常运行。

我尝试从initdb目录以及docker运行/usr/lib/postgresql/9.6/bin(从docker运行似乎没有持久性,甚至没有创建任何东西……如果有人知道我为什么会这样的话)有兴趣知道)

/var/lib/postgresql/data目录的内容:

drwxrwxrwx 19 postgres postgres  4096 Jun 28 20:41 .
drwxr-xr-x  5 postgres postgres  4096 Jun 28 20:41 ..
drwx------  5 postgres postgres  4096 Jun 28 20:41 base
drwx------  2 postgres postgres  4096 Jun 28 20:41 global
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_clog
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_commit_ts
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_dynshmem
-rw-------  1 postgres postgres  4468 Jun 28 20:41 pg_hba.conf
-rw-------  1 postgres postgres  1636 Jun 28 20:41 pg_ident.conf
drwx------  4 postgres postgres  4096 Jun 28 20:41 pg_logical
drwx------  4 postgres postgres  4096 Jun 28 20:41 pg_multixact
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_notify
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_replslot
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_serial
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_snapshots
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_stat
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_stat_tmp
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_subtrans
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_tblspc
drwx------  2 postgres postgres  4096 Jun 28 20:41 pg_twophase
-rw-------  1 postgres postgres     4 Jun 28 20:41 PG_VERSION
drwx------  3 postgres postgres  4096 Jun 28 20:41 pg_xlog
-rw-------  1 postgres postgres    88 Jun 28 20:41 postgresql.auto.conf
-rw-------  1 postgres postgres 22267 Jun 28 20:41 postgresql.conf  

PG_VERSION包含9.6

非常感谢您的帮助。

3 个答案:

答案 0 :(得分:4)

您正在更改默认的postgresql数据路径,因此需要初始化数据库。试试这个

volumes:
    - ./init.sql:/docker-entrypoint-initdb.d/init.sql

这是init.sql文件

CREATE USER docker;
CREATE DATABASE docker;
GRANT ALL PRIVILEGES ON DATABASE docker TO docker;

答案 1 :(得分:0)

因此,当拥有pom.xml时,它将把@SuppressWarnings("removal")挂载到名为postgres:/var/lib/postgresql/data的docker数据卷上。 Docker数据卷都存储在一个位置,具体位置取决于操作系统。

尝试将其更改为/var/lib/postgresql/data,以使其相对于您的工作目录创建名为postgres的目录。

由于源代码发生了变化,它将重新创建数据库,并且我愿意修复您看到的错误。如果没有,则可能是主机操作系统上的权限问题。

答案 2 :(得分:0)

我遇到了同样的问题,我重新启动了 Docker守护进程,甚至重新启动了机器,但没有解决问题。
路径/var/lib/postgresql/data甚至不在FS上。

注意:执行docker ps并没有显示postgresql容器正在运行。

解决方案(泊坞窗组成):

  • 关闭postgres容器:
    docker-compose -f <path_to_my_docker_compose_file.yaml> down postgres

  • 启动postgres容器:
    docker-compose -f <path_to_my_docker_compose_file.yaml> -d up postgres

-做到了! -

解决方案(码头工人):

docker stop <postgres_container>
docker start <postgres_container>

您可以尝试的另一种解决方案:
initdb <temporary_volum_folder>
示例:
initdb /tmp/postgres
docker-compose -f <path_to_my_docker_compose_file.yaml> -d up postgres

initdb /tmp/postgres docker start <postgres_container>

注意:
在我的情况下,postgres映像是在docker-compose.yaml文件中定义的,可以观察到我没有定义PG_DAT也不定义PG_VERSION并且容器运行正常。

  postgres:
    image: postgres:9.6.14
    container_name: postgres
    environment:
      POSTGRES_USER: 'pg12345678'
      POSTGRES_PASSWORD: 'pg12345678'
    ports:
      - "5432:5432"