У меня возникли проблемы с разрешениями при развертывании контейнера PostgreSQL 9.6 в Docker Swarm, который использует том, смонтированный по NFS, для хранения данных. Контейнер не запускается с ошибкой:
Код: Выделить всё
FATAL: data directory "/var/lib/postgresql/data/pg_data" has wrong ownership
HINT: The server must be started by the user that owns the data directory.
- Платформа: Docker Swarm
- Версия PostgreSQL: 9.6.24
- Сервер NFS: re0srt10003.eresz03.com
- NFS Монтирование: /vol/re0srt10003_vol011/NFS_customer_data_02/Production_data/nfs01/
- Примечание:
→ только действительные пользователи AD (unix/windows) могут использоваться для доступа к общему файловому ресурсу
→ доступ локальных пользователей не разрешен (пользователи, существующие только в локальной системе Linux)
→ Имейте в виду, что новые общие папки будут находиться на новом сервере re0srt10003.eresz03.com и, как упоминалось на нашей странице документации, локальные пользователи (пример UID 1000/GID 1000) не работают. Никаких исключений!
Для подключения к общему ресурсу используйте пользователей и группы вашего домена (UID 188044 / GID 806642981).
Файл Docker, использованный для создания образа
Код: Выделить всё
FROM postgres:9.6.24
ENV http_proxy=http://proxy.com:8686
ENV https_proxy=http://proxy.com:8686
RUN sed -i '/stretch-updates/d' /etc/apt/sources.list && \
sed -i 's|http://deb.debian.org/debian|http://archive.debian.org/debian|g' /etc/apt/sources.list && \
sed -i 's|http://security.debian.org/debian-security|http://archive.debian.org/debian-security|g' /etc/apt/sources.list && \
rm -f /etc/apt/sources.list.d/pgdg.list && \
echo 'Acquire::Check-Valid-Until "false";' > /etc/apt/apt.conf.d/10-no-check-valid-until && \
apt-get update && \
apt-get install -y --allow-unauthenticated postgresql-contrib && \
apt-get clean && \
rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
RUN usermod -u 188044 postgres
RUN groupmod -g 806642981 postgres
RUN su root -c "chown -R postgres:postgres /var/lib/postgresql"
USER postgres
STOPSIGNAL SIGINT
Код: Выделить всё
version: '3.7'
services:
fossology-scheduler:
command: scheduler
image: fossology:$VERSION
environment:
- FOSSOLOGY_DB_HOST=fossology-db
- FOSSOLOGY_DB_NAME=fossology
- FOSSOLOGY_DB_USER=fossy
- FOSSOLOGY_INSTANCE=$INSTANCE
networks:
- fossology-net
volumes:
- fossy_repo:/srv/fossology/repository
deploy:
placement:
constraints:
- node.labels.fossology == true
secrets:
- source: fossology-db-pwd
target: fossology.pwd
uid: '188044'
gid: '806642981'
mode: 0400
hostname: fossology-scheduler.localhost
fossology-web:
command: web
image: fossology:$VERSION
environment:
- FOSSOLOGY_DB_HOST=fossology
- FOSSOLOGY_DB_NAME=fossology
- FOSSOLOGY_DB_USER=fossui
- FOSSOLOGY_SCHEDULER_HOST=fossology-scheduler
- FOSSOLOGY_INSTANCE=$INSTANCE
user: fossui
networks:
- fossology-net
- nginx-net
volumes:
- fossy_repo:/srv/fossology/repository
deploy:
placement:
constraints:
- node.labels.fossology == true
secrets:
- source: fossology-db-pwd
target: fossology.pwd
uid: '188044'
gid: '806642981'
mode: 0400
fossology-db:
image: postgres_9.6:01
environment:
- POSTGRES_DB=fossology
- POSTGRES_USER=fossui
- POSTGRES_PASSWORD=password
- POSTGRES_INITDB_ARGS='-E UTF8'
- PGDATA=/var/lib/postgresql/data
ports:
- target: 5432
published: 9999
protocol: tcp
mode: ingress
networks:
- fossology-net
volumes:
- fossy_pg_data:/var/lib/postgresql/data
deploy:
placement:
constraints:
- node.labels.fossology == true
networks:
fossology-net:
name : fossology-net-$INSTANCE
driver: overlay
external: true
nginx-net:
external: true
volumes:
fossy_repo:
driver: local
driver_opts:
type: nfs
o: "addr=re0srt10003.eresz03.com,rw,nfsvers=4"
device: ":/vol/re0srt10003_vol011/NFS_customer_data_02/Production_data/nfs01/repo"
fossy_pg_data:
driver: local
driver_opts:
type: nfs
o: "addr=re0srt10003.eresz03.com,rw,nfsvers=4"
device: ":/vol/re0srt10003_vol011/NFS_customer_data_02/Production_data/nfs01/db"
secrets:
fossology-db-pwd:
external: true
- Изменил Dockerfile, чтобы изменить UID/GID пользователя postgres в соответствии с требованиями домена.
- Проверил, что сопоставление пользователей внутри контейнера показывает правильные идентификаторы.
id postgres
uid=188044(postgres) gid=806642981(postgres) groups=806642981(postgres),101(ssl-cert) - Подтверждено, что монтирование NFS доступно для владельцев, как показано ниже:
drwx--S--- 8 188044 806642981 db - Пытался запустить службу без тома NFS — работает как положено.
Ранее эта настройка работала с локальным пользователем/пользователем root, но не удалась при переходе на новую систему хранения на основе NFS, которая обеспечивает принудительное использование пользователей домена.
Любые предложения относительно возможных основных причин или альтернативных способов решения этой проблемы будут высоко оценены!.
Подробнее здесь: https://stackoverflow.com/questions/798 ... omain-user
Мобильная версия