DOCKER 带有 postgres 的容器,警告:无法打开统计文件 "pg_stat_tmp/global.stat":不允许操作
DOCKER container with postgres, WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
我有一个 DOCKER 容器,它是使用 .yml、Docker 文件等从几个不同的图像构建的。到目前为止,除了这个问题外,一切都构建和运行良好我在标题中看到提到:
index-db_1 | 2021-02-22 23:18:33.388 UTC [31] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
该数据库索引映射到 Docker 包根目录中主机上的一个文件夹,就数据库而言,其他一切似乎都工作正常。我使用的是 Mac,但如果我列出来自 CLI 的 DB 文件夹权限,我会得到:
-rw-------@ 1 sscotti staff 3 Feb 22 11:01 PG_VERSION
drwx------@ 6 sscotti staff 192 Feb 22 11:54 base
drwx------@ 60 sscotti staff 1920 Feb 22 16:00 global
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_commit_ts
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_dynshmem
-rw-------@ 1 sscotti staff 4782 Feb 22 11:02 pg_hba.conf
-rw-------@ 1 sscotti staff 1636 Feb 22 11:01 pg_ident.conf
drwx------@ 5 sscotti staff 160 Feb 22 17:46 pg_logical
drwx------@ 4 sscotti staff 128 Feb 22 11:01 pg_multixact
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_notify
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_replslot
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_serial
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_snapshots
drwx------@ 2 sscotti staff 64 Feb 22 16:00 pg_stat
drwx------@ 5 sscotti staff 160 Feb 22 17:50 pg_stat_tmp
drwx------@ 3 sscotti staff 96 Feb 22 11:01 pg_subtrans
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_tblspc
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_twophase
drwx------@ 4 sscotti staff 128 Feb 22 11:01 pg_wal
drwx------@ 3 sscotti staff 96 Feb 22 11:01 pg_xact
-rw-------@ 1 sscotti staff 88 Feb 22 11:01 postgresql.auto.conf
-rw-------@ 1 sscotti staff 28073 Feb 22 11:01 postgresql.conf
-rw-------@ 1 sscotti staff 36 Feb 22 16:00 postmaster.opts
-rw------- 1 sscotti staff 94 Feb 22 16:00 postmaster.pid
pg_stat文件夹实际上是空的。
和pg_stat_temp有:
-rw------- 1 sscotti staff 1952 Feb 22 17:54 db_0.stat
-rw------- 1 sscotti staff 20360 Feb 22 17:54 db_13395.stat
-rw------- 1 sscotti staff 1151 Feb 22 17:54 global.stat
.yml 文件有这个:
index-db:
image: postgres
restart: unless-stopped
volumes:
- ./OrthancIndex:/var/lib/postgresql/data
鉴于它是一个 Docker 容器,是否可以忽略它。
在 UBUNTU 上添加关于相同设置的评论。
数据库文件夹:
drwx------ 19 systemd-coredump root 4096 Jun 30 13:12 OrthancIndex
数据库:
drwx------ 6 systemd-coredump systemd-coredump 4096 Jun 11 13:00 base
drwx------ 2 systemd-coredump systemd-coredump 4096 Jun 30 13:12 global
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_commit_ts
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_dynshmem
-rw------- 1 systemd-coredump systemd-coredump 4782 Mar 12 16:12 pg_hba.conf
-rw------- 1 systemd-coredump systemd-coredump 1636 Mar 12 16:12 pg_ident.conf
drwx------ 4 systemd-coredump systemd-coredump 4096 Jul 1 13:27 pg_logical
drwx------ 4 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_multixact
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_notify
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_replslot
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_serial
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_snapshots
drwx------ 2 systemd-coredump systemd-coredump 4096 Jun 30 13:12 pg_stat
drwx------ 2 systemd-coredump systemd-coredump 4096 Jul 1 13:29 pg_stat_tmp
drwx------ 2 systemd-coredump systemd-coredump 4096 Jun 24 21:04 pg_subtrans
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_tblspc
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_twophase
-rw------- 1 systemd-coredump systemd-coredump 3 Mar 12 16:12 PG_VERSION
drwx------ 3 systemd-coredump systemd-coredump 4096 Jul 1 12:37 pg_wal
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_xact
-rw------- 1 systemd-coredump systemd-coredump 88 Mar 12 16:12 postgresql.auto.conf
-rw------- 1 systemd-coredump systemd-coredump 28073 Mar 12 16:12 postgresql.conf
-rw------- 1 systemd-coredump systemd-coredump 36 Jun 30 13:12 postmaster.opts
-rw------- 1 systemd-coredump systemd-coredump 94 Jun 30 13:12 postmaster.pid
pg_stat_temp
-rw------- 1 systemd-coredump systemd-coredump 2660 Jul 1 13:30 db_0.stat
-rw------- 1 systemd-coredump systemd-coredump 31157 Jul 1 13:30 db_13395.stat
-rw------- 1 systemd-coredump systemd-coredump 1151 Jul 1 13:30 global.stat
实际上我在 UBUNTU 上得到了同样的错误:
postgres_index-db_1 | 2021-07-01 18:06:45.140 UTC [266] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
postgres_index-db_1 | 2021-07-01 18:13:45.583 UTC [273] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
postgres_index-db2_1 | 2021-07-01 18:19:43.716 UTC [282] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
postgres_index-db2_1 | 2021-07-01 18:21:43.749 UTC [284] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
虽然这里的用户和组是systemd-coredump.
使用本地卷安装需要在 postgres 容器中进行用户映射。 https://hub.docker.com/_/postgres 自述文件中有一个标题为 Arbitrary --user Notes 的部分描述了问题的解决方案。
列出的一个建议是使用 docker 卷,初始化已安装卷的内容,关闭容器映像,运行 递归所有权更改,然后正常重启容器。
$ docker volume create pgdata
$ docker run -it --rm -v pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecretpassword postgres
The files belonging to this database system will be owned by user "postgres".
...
( once it's finished initializing successfully and is waiting for connections, stop it )
$ docker run -it --rm -v pgdata:/var/lib/postgresql/data bash chown -R 1000:1000 /var/lib/postgresql/data
$ docker run -it --rm --user 1000:1000 -v pgdata:/var/lib/postgresql/data postgres
简单粗暴
我尝试了另一种方法:将临时文件留在容器中,您无需处理用户权限 - 并且有效。我已经使用内联命令更改了 docker-compose.yml:
中的 Postgresql 配置
postgresdb:
image: 'postgres'
command: postgres -c stats_temp_directory=/tmp
.
.
.
这是一个快速简单的解决方案,但它没有设置多个 postgres 配置参数。随着时间的推移,我找到了另一个解决方案。
高级 (added on 22/01/14 09:00PM CET)
高级解决方案包含以下步骤:
- 准备你想要的
postgresql.conf
- 在这里你可以设置你需要的任何 postgres 服务器参数。本帖解决问题的必要条件是:
stats_temp_directory = '/tmp/stat_temporary'
- 创建 bash 文件,您将在
docker-compose.yml
中开始使用 docker-entrypoint-initdb.d
,您将使用该文件将您的配置复制到 docker 中的 postgres 配置目录并创建您的临时文件文件夹。
如果您这样设置 docker-compose.yml:
postgres-db:
image: postgres
container_name: 'dbcontainer'
volumes:
# point to your postgres init scripts (folder or file)
- $PWD/db_init:/docker-entrypoint-initdb.d
# if you need persistent data, point data to local folder
- $PWD/database:/var/lib/postgresql/data
# if you want some data restore, point to your backup
- $PWD/db_backup:/db_backup
# point docker to directory with your config
- $PWD/db_config:/db_config
然后数据库将使用 db_init
目录中的脚本进行初始化。 (或者您可以直接指向一个 sql 或 bash 文件。如果您指向目录,init 脚本将 运行 所有文件按字母顺序排列。
您将放置在 db_init
文件夹中的带有初始化 bash 脚本的文件可能如下所示,并将在 docker:
中启动
echo starting script...
# create temporary directory for postgres in docker
mkdir /tmp/stat_temporary
# copy your postgresql.conf to postgresql config location in docker
cp /db_config/postgresql.conf var/lib/postgresql/data/postgresql.conf
# alternatively you can run any pg script you need, here I restore backup to new database
pg_restore -U postgres -v -Fc -d analysis /db_backup/analysis_backup.bak
echo finished
此脚本 运行 后,docker 上的数据库服务将重新启动并加载您设置的新参数。
为我未来的自己写下这个作为回答问题:查看 the documentation 并采用上面@Fide 的解决方案,以下 似乎 有效在 MacOSX Monterey 上 运行 一个 PostGIS 图像(它只是建立在 Postgres 图像之上)...
请注意,这是从 shell 脚本中获取的,用于在主机系统上启动具有持久本地存储的 Postgres+PostGIS 图像:
WORK_DIR="$HOME/Documents/git/project"
DOCKER_NM="postgis"
DOCKER_IMG="postgis/postgis"
POSTGRES_PWD="XXX"
PORT_NO="5432"
docker run --name $DOCKER_NM \
-e POSTGRES_PASSWORD=$POSTGRES_PWD \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v "$WORK_DIR/data/postgres":/var/lib/postgresql/data \
-p "$PORT_NO:5432" -d $DOCKER_IMG \
postgres -c stats_temp_directory=/tmp
如果您是直接从终端 运行(即不是通过 zsh/bash),那么您需要 export
每个参数,而不仅仅是指定它们。
有了这个,global.stat 错误似乎已经消失了...不过我应该指出,我只是刚刚弄明白了这一点,并且 运行 进入容器还不到 60 分钟.另一种方法是按照该页面上的说明创建和使用从本地 FS 安装的 persistent 自定义 conf 文件(扩展@SScotti 上面的评论):
-v "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf
我 运行 遇到了同样的问题 - 仔细研究并最终找到了一个简单的解决方案。
首先是一些基本背景 - 您的 pg_stat_temp_directory 位置是您的 data_directory.
下的一个子目录
show data_directory ;
如果它 returns 基于 Unix 的系统的默认值,例如
/var/lib/postgresql/data
你的命令显示 stats_temp
show stats_temp_directory ;
也是returns默认值
pg_stat_tmp
那么您 stats_temp_directory 的完整路径是 /var/lib/postgresql/data/pg_stat_tmp
我正在使用绑定映射将 PG 容器数据文件映射到我的主机,这样即使在容器停止后我也可以保留数据。
docker run -d --name gutlo-postgres -p 5434:5432 -v /data/postgres-docker/14:/var/lib/postgresql/data -e POSTGRES_PASSWORD=<PASSWORD> postgres:latest
现在每次我启动容器时,它都会自动在 stats_temp 目录下创建文件,一旦出现问题就调用 global.stat
ls -la global.stat
-rw-------- 1 ssengupta admin 3648 5 月 13 日 16:24 global.stat
ls -la . | head -2 | tail -1
drwxr-xr-x@ 14 ssengupta 管理员 448 5 月 13 16:26 .
- 现在你看,问题出在哪里了。容器能够创建文件 global.stat(其目录文件“.”具有打开 rwx 权限。但文件本身是在没有打开权限的情况下创建的,因此我的容器无法访问其自己创建的文件。
来自docker手册,有temp挂载的概念。因此,只需为 stats_temp 目录创建一个临时挂载点,docker 将使用 tempfs / RAM - 这消除了权限问题。
--mount type=tmpfs,destination=/var/lib/postgresql/data/pg_stat_tmp
此外,它也会提高性能,尽管您可能没有检测到它。
不是原始问题的答案,但由于缺乏声誉点,我无法添加我的两分钱作为评论。所以这是一个使用 tmpfs
解决方案作为答案的工作 docker-compose.yml
文件(对于@SScotti 和其他任何想在不混淆默认命令或配置的情况下尝试此操作的人):
环境文件(.env
):
POSTGRES_VERSION=13.6
DATABASE_NAME=dbname
DATABASE_USER=dbuser
DATABASE_PASS=dbpass
撰写文件(docker-compose.yml
):
version: '3.6'
services:
postgres:
image: postgres:${POSTGRES_VERSION}-alpine
restart: always
container_name: postgres
environment:
POSTGRES_DB: ${DATABASE_NAME}
POSTGRES_USER: ${DATABASE_USER}
POSTGRES_PASSWORD: ${DATABASE_PASS}
volumes:
- /etc/timezone:/etc/timezone:ro
- .volumes/pgdata:/var/lib/postgresql/data
- type: tmpfs
target: /var/lib/postgresql/data/pg_stat_tmp
tmpfs:
# 256 Mb - beware the default, it's infinity(!)
size: 268435456
编辑:先注释 运行
首先 运行、postgres
尝试初始化数据库 失败 ,因为非空数据目录(existing/mounted tmpfs pg_stats_tmp
在 data
目录中)。
为避免这种情况,您必须先 运行 服务,而不要在撰写文件中添加 tmpfs
部分,当 postgres
完成初始化后,关闭服务并启用tmpfs
再次启动服务之前撰写文件中的部分。
我有一个 DOCKER 容器,它是使用 .yml、Docker 文件等从几个不同的图像构建的。到目前为止,除了这个问题外,一切都构建和运行良好我在标题中看到提到:
index-db_1 | 2021-02-22 23:18:33.388 UTC [31] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
该数据库索引映射到 Docker 包根目录中主机上的一个文件夹,就数据库而言,其他一切似乎都工作正常。我使用的是 Mac,但如果我列出来自 CLI 的 DB 文件夹权限,我会得到:
-rw-------@ 1 sscotti staff 3 Feb 22 11:01 PG_VERSION
drwx------@ 6 sscotti staff 192 Feb 22 11:54 base
drwx------@ 60 sscotti staff 1920 Feb 22 16:00 global
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_commit_ts
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_dynshmem
-rw-------@ 1 sscotti staff 4782 Feb 22 11:02 pg_hba.conf
-rw-------@ 1 sscotti staff 1636 Feb 22 11:01 pg_ident.conf
drwx------@ 5 sscotti staff 160 Feb 22 17:46 pg_logical
drwx------@ 4 sscotti staff 128 Feb 22 11:01 pg_multixact
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_notify
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_replslot
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_serial
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_snapshots
drwx------@ 2 sscotti staff 64 Feb 22 16:00 pg_stat
drwx------@ 5 sscotti staff 160 Feb 22 17:50 pg_stat_tmp
drwx------@ 3 sscotti staff 96 Feb 22 11:01 pg_subtrans
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_tblspc
drwx------@ 2 sscotti staff 64 Feb 22 11:01 pg_twophase
drwx------@ 4 sscotti staff 128 Feb 22 11:01 pg_wal
drwx------@ 3 sscotti staff 96 Feb 22 11:01 pg_xact
-rw-------@ 1 sscotti staff 88 Feb 22 11:01 postgresql.auto.conf
-rw-------@ 1 sscotti staff 28073 Feb 22 11:01 postgresql.conf
-rw-------@ 1 sscotti staff 36 Feb 22 16:00 postmaster.opts
-rw------- 1 sscotti staff 94 Feb 22 16:00 postmaster.pid
pg_stat文件夹实际上是空的。
和pg_stat_temp有:
-rw------- 1 sscotti staff 1952 Feb 22 17:54 db_0.stat
-rw------- 1 sscotti staff 20360 Feb 22 17:54 db_13395.stat
-rw------- 1 sscotti staff 1151 Feb 22 17:54 global.stat
.yml 文件有这个:
index-db:
image: postgres
restart: unless-stopped
volumes:
- ./OrthancIndex:/var/lib/postgresql/data
鉴于它是一个 Docker 容器,是否可以忽略它。
在 UBUNTU 上添加关于相同设置的评论。
数据库文件夹:
drwx------ 19 systemd-coredump root 4096 Jun 30 13:12 OrthancIndex
数据库:
drwx------ 6 systemd-coredump systemd-coredump 4096 Jun 11 13:00 base
drwx------ 2 systemd-coredump systemd-coredump 4096 Jun 30 13:12 global
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_commit_ts
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_dynshmem
-rw------- 1 systemd-coredump systemd-coredump 4782 Mar 12 16:12 pg_hba.conf
-rw------- 1 systemd-coredump systemd-coredump 1636 Mar 12 16:12 pg_ident.conf
drwx------ 4 systemd-coredump systemd-coredump 4096 Jul 1 13:27 pg_logical
drwx------ 4 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_multixact
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_notify
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_replslot
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_serial
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_snapshots
drwx------ 2 systemd-coredump systemd-coredump 4096 Jun 30 13:12 pg_stat
drwx------ 2 systemd-coredump systemd-coredump 4096 Jul 1 13:29 pg_stat_tmp
drwx------ 2 systemd-coredump systemd-coredump 4096 Jun 24 21:04 pg_subtrans
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_tblspc
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_twophase
-rw------- 1 systemd-coredump systemd-coredump 3 Mar 12 16:12 PG_VERSION
drwx------ 3 systemd-coredump systemd-coredump 4096 Jul 1 12:37 pg_wal
drwx------ 2 systemd-coredump systemd-coredump 4096 Mar 12 16:12 pg_xact
-rw------- 1 systemd-coredump systemd-coredump 88 Mar 12 16:12 postgresql.auto.conf
-rw------- 1 systemd-coredump systemd-coredump 28073 Mar 12 16:12 postgresql.conf
-rw------- 1 systemd-coredump systemd-coredump 36 Jun 30 13:12 postmaster.opts
-rw------- 1 systemd-coredump systemd-coredump 94 Jun 30 13:12 postmaster.pid
pg_stat_temp
-rw------- 1 systemd-coredump systemd-coredump 2660 Jul 1 13:30 db_0.stat
-rw------- 1 systemd-coredump systemd-coredump 31157 Jul 1 13:30 db_13395.stat
-rw------- 1 systemd-coredump systemd-coredump 1151 Jul 1 13:30 global.stat
实际上我在 UBUNTU 上得到了同样的错误:
postgres_index-db_1 | 2021-07-01 18:06:45.140 UTC [266] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
postgres_index-db_1 | 2021-07-01 18:13:45.583 UTC [273] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
postgres_index-db2_1 | 2021-07-01 18:19:43.716 UTC [282] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
postgres_index-db2_1 | 2021-07-01 18:21:43.749 UTC [284] WARNING: could not open statistics file "pg_stat_tmp/global.stat": Operation not permitted
虽然这里的用户和组是systemd-coredump.
使用本地卷安装需要在 postgres 容器中进行用户映射。 https://hub.docker.com/_/postgres 自述文件中有一个标题为 Arbitrary --user Notes 的部分描述了问题的解决方案。
列出的一个建议是使用 docker 卷,初始化已安装卷的内容,关闭容器映像,运行 递归所有权更改,然后正常重启容器。
$ docker volume create pgdata
$ docker run -it --rm -v pgdata:/var/lib/postgresql/data -e POSTGRES_PASSWORD=mysecretpassword postgres
The files belonging to this database system will be owned by user "postgres".
...
( once it's finished initializing successfully and is waiting for connections, stop it )
$ docker run -it --rm -v pgdata:/var/lib/postgresql/data bash chown -R 1000:1000 /var/lib/postgresql/data
$ docker run -it --rm --user 1000:1000 -v pgdata:/var/lib/postgresql/data postgres
简单粗暴
我尝试了另一种方法:将临时文件留在容器中,您无需处理用户权限 - 并且有效。我已经使用内联命令更改了 docker-compose.yml:
中的 Postgresql 配置postgresdb:
image: 'postgres'
command: postgres -c stats_temp_directory=/tmp
.
.
.
这是一个快速简单的解决方案,但它没有设置多个 postgres 配置参数。随着时间的推移,我找到了另一个解决方案。
高级 (added on 22/01/14 09:00PM CET)
高级解决方案包含以下步骤:
- 准备你想要的
postgresql.conf
- 在这里你可以设置你需要的任何 postgres 服务器参数。本帖解决问题的必要条件是:
stats_temp_directory = '/tmp/stat_temporary'
- 创建 bash 文件,您将在
docker-compose.yml
中开始使用docker-entrypoint-initdb.d
,您将使用该文件将您的配置复制到 docker 中的 postgres 配置目录并创建您的临时文件文件夹。
如果您这样设置 docker-compose.yml:
postgres-db:
image: postgres
container_name: 'dbcontainer'
volumes:
# point to your postgres init scripts (folder or file)
- $PWD/db_init:/docker-entrypoint-initdb.d
# if you need persistent data, point data to local folder
- $PWD/database:/var/lib/postgresql/data
# if you want some data restore, point to your backup
- $PWD/db_backup:/db_backup
# point docker to directory with your config
- $PWD/db_config:/db_config
然后数据库将使用 db_init
目录中的脚本进行初始化。 (或者您可以直接指向一个 sql 或 bash 文件。如果您指向目录,init 脚本将 运行 所有文件按字母顺序排列。
您将放置在 db_init
文件夹中的带有初始化 bash 脚本的文件可能如下所示,并将在 docker:
echo starting script...
# create temporary directory for postgres in docker
mkdir /tmp/stat_temporary
# copy your postgresql.conf to postgresql config location in docker
cp /db_config/postgresql.conf var/lib/postgresql/data/postgresql.conf
# alternatively you can run any pg script you need, here I restore backup to new database
pg_restore -U postgres -v -Fc -d analysis /db_backup/analysis_backup.bak
echo finished
此脚本 运行 后,docker 上的数据库服务将重新启动并加载您设置的新参数。
为我未来的自己写下这个作为回答问题:查看 the documentation 并采用上面@Fide 的解决方案,以下 似乎 有效在 MacOSX Monterey 上 运行 一个 PostGIS 图像(它只是建立在 Postgres 图像之上)...
请注意,这是从 shell 脚本中获取的,用于在主机系统上启动具有持久本地存储的 Postgres+PostGIS 图像:
WORK_DIR="$HOME/Documents/git/project"
DOCKER_NM="postgis"
DOCKER_IMG="postgis/postgis"
POSTGRES_PWD="XXX"
PORT_NO="5432"
docker run --name $DOCKER_NM \
-e POSTGRES_PASSWORD=$POSTGRES_PWD \
-e PGDATA=/var/lib/postgresql/data/pgdata \
-v "$WORK_DIR/data/postgres":/var/lib/postgresql/data \
-p "$PORT_NO:5432" -d $DOCKER_IMG \
postgres -c stats_temp_directory=/tmp
如果您是直接从终端 运行(即不是通过 zsh/bash),那么您需要 export
每个参数,而不仅仅是指定它们。
有了这个,global.stat 错误似乎已经消失了...不过我应该指出,我只是刚刚弄明白了这一点,并且 运行 进入容器还不到 60 分钟.另一种方法是按照该页面上的说明创建和使用从本地 FS 安装的 persistent 自定义 conf 文件(扩展@SScotti 上面的评论):
-v "$PWD/my-postgres.conf":/etc/postgresql/postgresql.conf
我 运行 遇到了同样的问题 - 仔细研究并最终找到了一个简单的解决方案。
首先是一些基本背景 - 您的 pg_stat_temp_directory 位置是您的 data_directory.
下的一个子目录show data_directory ;
如果它 returns 基于 Unix 的系统的默认值,例如
/var/lib/postgresql/data
你的命令显示 stats_temp
show stats_temp_directory ;
也是returns默认值
pg_stat_tmp
那么您 stats_temp_directory 的完整路径是 /var/lib/postgresql/data/pg_stat_tmp
我正在使用绑定映射将 PG 容器数据文件映射到我的主机,这样即使在容器停止后我也可以保留数据。
docker run -d --name gutlo-postgres -p 5434:5432 -v /data/postgres-docker/14:/var/lib/postgresql/data -e POSTGRES_PASSWORD=<PASSWORD> postgres:latest
现在每次我启动容器时,它都会自动在 stats_temp 目录下创建文件,一旦出现问题就调用 global.stat
ls -la global.stat
-rw-------- 1 ssengupta admin 3648 5 月 13 日 16:24 global.stat
ls -la . | head -2 | tail -1
drwxr-xr-x@ 14 ssengupta 管理员 448 5 月 13 16:26 .
- 现在你看,问题出在哪里了。容器能够创建文件 global.stat(其目录文件“.”具有打开 rwx 权限。但文件本身是在没有打开权限的情况下创建的,因此我的容器无法访问其自己创建的文件。
来自docker手册,有temp挂载的概念。因此,只需为 stats_temp 目录创建一个临时挂载点,docker 将使用 tempfs / RAM - 这消除了权限问题。
--mount type=tmpfs,destination=/var/lib/postgresql/data/pg_stat_tmp
此外,它也会提高性能,尽管您可能没有检测到它。
不是原始问题的答案,但由于缺乏声誉点,我无法添加我的两分钱作为评论。所以这是一个使用 tmpfs
解决方案作为答案的工作 docker-compose.yml
文件(对于@SScotti 和其他任何想在不混淆默认命令或配置的情况下尝试此操作的人):
环境文件(.env
):
POSTGRES_VERSION=13.6
DATABASE_NAME=dbname
DATABASE_USER=dbuser
DATABASE_PASS=dbpass
撰写文件(docker-compose.yml
):
version: '3.6'
services:
postgres:
image: postgres:${POSTGRES_VERSION}-alpine
restart: always
container_name: postgres
environment:
POSTGRES_DB: ${DATABASE_NAME}
POSTGRES_USER: ${DATABASE_USER}
POSTGRES_PASSWORD: ${DATABASE_PASS}
volumes:
- /etc/timezone:/etc/timezone:ro
- .volumes/pgdata:/var/lib/postgresql/data
- type: tmpfs
target: /var/lib/postgresql/data/pg_stat_tmp
tmpfs:
# 256 Mb - beware the default, it's infinity(!)
size: 268435456
编辑:先注释 运行
首先 运行、postgres
尝试初始化数据库 失败 ,因为非空数据目录(existing/mounted tmpfs pg_stats_tmp
在 data
目录中)。
为避免这种情况,您必须先 运行 服务,而不要在撰写文件中添加 tmpfs
部分,当 postgres
完成初始化后,关闭服务并启用tmpfs
再次启动服务之前撰写文件中的部分。