如何解决postgresql docker容器挂载nfs卷时的chown权限问题?

Dav*_*vid 5 nfs docker

我正在 Mac 上使用 docker,并尝试使用 nfs 卷获取 postgresql 数据库的持久容器。

/Users/me/db -alldirs *(rw,sync,no_subtree_check,no_root_squash)我输入一行/etc/exports并重新启动 nfsd。我认为(如果我错了请纠正我)关键点是 no_root_squash 它将允许客户端 root 用户仍然是 root 用户。然后在我的 docker-compose.yml 中,我将 nfsmount 点声明为以下内容:

version: '2'
volumes:
  nfsmountdbdata:
    driver: local
    driver_opts:
      type: nfs
      o: addr=host.docker.internal,rw,nolock,hard,nointr,nfsvers=3
      device: ":/Users/me/db/data"
  nfsmountdbinit:
    driver: local
    driver_opts:
      type: nfs
      o: addr=host.docker.internal,rw,nolock,hard,nointr,nfsvers=3
      device: ":/Users/me/db/initdb"
services:

  ## POSTGRES DATABASE
  db:
    image: postgres:9.6
    privileged: true
    volumes:
      #- ./services/db/initdb:/docker-entrypoint-initdb.d
      #- ./services/db/app:/var/lib/postgresql/data
      - nfsmountdbinit:/docker-entrypoint-initdb.d
      - nfsmountdbdata:/var/lib/postgresql/data
    ports:
      - 5432:5432
Run Code Online (Sandbox Code Playgroud)

但是当容器数据库启动时,它会抱怨很多关于chown: changing ownership of '/var/lib/postgresql/data/base/**/**': Operation not permitted. 这让我感到非常困惑,因为我做了一些事情(nfs 中的 no_root_squash 配置)来修复它。但它就是行不通。我这里的理解有什么问题吗?我正在使用 Mac Mojave 和适用于 Mac 2.0.0.0 稳定版的 Docker 桌面。

Mat*_*amp 0

我相信我解决了这个问题...

Dockerfile

FROM postgres:9.6
ARG GNAME='groupname'
ARG GID='groupid'
ARG USERID=999

# fix permissions so it can persist data on the host nfs file system
RUN groupadd -g $GID $GNAME \
 && usermod -g $GNAME postgres \
 && usermod -u $USERID postgres

# go get the entrypoint script from their git hub link and details to follow
COPY ./docker-entrypoint.sh /usr/local/bin/docker-entrypoint.sh
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["postgres"]
Run Code Online (Sandbox Code Playgroud)

在此处获取 Postgres 入口点脚本

对其进行编辑,注释掉第 34、35、36、52、53、54 行。基本上是它尝试的位置chmodchownNFS 文件夹。

...
if [ "$1" = 'postgres' ] && [ "$(id -u)" = '0' ]; then
    #mkdir -p "$PGDATA"
    #chown -R postgres "$PGDATA"
    #chmod 700 "$PGDATA"
...
if [ "$1" = 'postgres' ]; then
    #mkdir -p "$PGDATA"
    #chown -R "$(id -u)" "$PGDATA" 2>/dev/null || :
    #chmod 700 "$PGDATA" 2>/dev/null || :
...
Run Code Online (Sandbox Code Playgroud)

现在构建图像...

docker build -t postgres9.6:nfs --build-arg GID=<NFS GROUP ID> ==build-arg GNAME=<NFS GROUP NAME> --build-arg USERID=<NFS USER ID> .
Run Code Online (Sandbox Code Playgroud)

我所说的 NFS 组 ID、用户 ID 和组名称是指对 NFS 文件夹具有读/写访问权限的用户/组。

现在您应该拥有一个 Postgres Docker 映像,该映像能够使用 NFS 主机卷来存储数据库数据。

希望这可以帮助..