如何解决在挂载NFS卷时,PostgreSQL Docker容器的chown权限问题?

4
我正在Mac上使用docker,并尝试使用nfs卷获取postgresql数据库的持久化容器。
我在/etc/exports中加入一行代码 /Users/me/db -alldirs *(rw,sync,no_subtree_check,no_root_squash),并重新启动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

但是当容器db启动时,它会频繁抱怨 chown: changing ownership of '/var/lib/postgresql/data/base/**/**': Operation not permitted。这让我感到非常困惑,因为我已经做了一些事情(在nfs中配置了no_root_squash),以解决这个问题。但它就是不起作用。我的理解有什么问题吗?我正在使用Mac Mojave和Docker桌面版2.0.0.0稳定版。


你找到解决方案了吗? - Matt Camp
3个回答

1
你不需要创建一个新的镜像来更改用户,只需将Postgres镜像作为不同的用户运行即可:
  postgres:
    image: postgres:9.6
    environment:
      - PGDATA=/var/lib/postgresql/data/pgdata
    user: "${UID:?You must do 'export UID' to launch}:${GID:?You must do 'export GID' to launch}"
    volumes:
      - nfsmountdbdata:/var/lib/postgresql/data
    ports:
      - 5432:5432

0

对我来说最容易的方法是添加一个Dockerfile,其中包括以下内容:

FROM postgres:11.2
ENV TZ=America/Los_Angeles

# Make us the same gid/id as the nfs mount.
RUN sed -i 's/:999:/:5081:/g' /etc/group
RUN sed -i 's/:999:999:/:5081:5081:/g' /etc/passwd


CMD [ "postgres", "-c", "max_connections=10000"]


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"]

获取Postgres入口脚本这里 对它进行编辑,注释掉34、35、36、52、53、54行。主要是它尝试对NFS文件夹进行chmod和chown操作。
...
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 || :
...

现在开始构建图像...

docker build -t postgres9.6:nfs --build-arg GID=<NFS GROUP ID> ==build-arg GNAME=<NFS GROUP NAME> --build-arg USERID=<NFS USER ID> .

我所说的NFS GROUP ID、USER ID和GROUP NAME指的是具有读写NFS文件夹访问权限的用户/组。
现在您应该拥有一个Postgres Docker映像,可以使用NFS主机卷来存储数据库数据。
希望这有所帮助。

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