Docker无法识别Postgresql数据目录。

15

我正在拼命尝试使我继承的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 服务可以自行启动和正常运行。

我尝试从 /usr/lib/postgresql/9.6/bin 目录以及 Docker 中运行 initdb 命令,但似乎在 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个回答

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;

4
我遇到了相同的问题,我重启了 Docker 守护进程 甚至重启了机器,但是问题并未得到解决。
路径 /var/lib/postgresql/data 并不在 FS 上。

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

解决方案 (docker-compose):

  • 关闭 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):

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"

1
当使用 postgres:/var/lib/postgresql/data 时,它将把 /var/lib/postgresql/data 挂载到名为 postgres 的 Docker 数据卷中。Docker 数据卷存储在一个位置上,该位置因操作系统而异。
尝试将其更改为 ./postgres,以便它相对于您的工作目录创建一个名为 postgres 的目录。
由于源正在更改,它将重新创建数据库,并且我愿意修复您看到的错误。如果没有,则可能是主机操作系统上的权限问题。

谢谢...我尝试了你的建议,但无论我做什么都会得到相同的错误。似乎Postgres镜像被设计为检查该目录,并且由于某种原因不喜欢它。 - WebDev
无效的挂载路径:'postgres',挂载路径必须是绝对路径(docker-compose 3.0)。 - mediafreakch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接