Как решить проблему с разрешением chown для docker-контейнера postgresql при монтировании тома nfs? - PullRequest
0 голосов
/ 08 декабря 2018

Я использую docker на Mac и пытаюсь получить постоянный контейнер базы данных postgresql, используя том nfs.

Я помещаю одну строку /Users/me/db -alldirs *(rw,sync,no_subtree_check,no_root_squash) в /etc/exports и перезагружаю nfsd.Я думаю (поправьте меня, если я ошибаюсь) ключевой момент - no_root_squash, который позволит корневому пользователю клиента оставаться пользователем 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.Меня это очень смущает, поскольку я что-то сделал (конфигурация no_root_squash в nfs), чтобы это исправить.Но это просто не работает.Что не так с моим пониманием здесь?Я использую Mac Mojave и рабочий стол Docker для Mac 2.0.0.0 stabel.

Ответы [ 3 ]

0 голосов
/ 04 июля 2019

Мне было проще всего добавить 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 голосов
/ 14 августа 2019

Вам не нужно создавать новое изображение для смены пользователя, вместо этого вы можете просто запустить изображение 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 голосов
/ 15 февраля 2019

Мне кажется, я решил это ...

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. В основном, там, где он пытается chmod и chown папки NFS.

...
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 для хранения данных базы данных.

Надеюсь, это поможет ..

...