Nextcloud с Docker: не может создать или записать в каталог данных

Я успешно установил Nextcloud 13.0, используя Docker и Docker Compose.

Вот репозиторий GitHub для Docker-образа Nextcloud: https://github.com/nextcloud/docker

По умолчанию моя установка Nextcloud сохраняет данные по следующему пути:

/var/lib/docker/volumes/nextcloud_nextcloud/_data/data/user/files

мой /var папка находится на небольшом разделе, а /home папка имеет около 2 ТБ дискового пространства. Я пытаюсь настроить Nextcloud для хранения загруженных файлов в /home/iamdocker/nextcloud/data на хост-машине, но это не работает.

На странице конфигурации Nextcloud отображается следующее сообщение:

ошибка

Не могу создать или записать в каталог данных / home / iamdocker / nextcloud / data /

Моя установка Nextcloud (запущенная в контейнере Docker) не имеет разрешения на запись.

.env

MYSQL_ROOT_PASSWORD=***********************
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
MYSQL_PASSWORD=************************************
MYSQL_HOST=db

NEXTCLOUD_VERSION=13.0
NEXTCLOUD_ADMIN_USER=example
NEXTCLOUD_ADMIN_PASSWORD=********************************
NEXTCLOUD_TABLE_PREFIX=nc_
NEXTCLOUD_DATA_DIR=/home/iamdocker/nextcloud/data/

докер-compose.yml

version: '2'

volumes:
  nextcloud:
  db:

services:
  db:
    image: mariadb
    env_file:
      - .env
    restart: always
    volumes:
      - db:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MYSQL_DATABASE=${MYSQL_DATABASE}
      - MYSQL_USER=${MYSQL_USER}
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}

  app:
    image: nextcloud:${NEXTCLOUD_VERSION}
    env_file:
      - .env
    ports:
      - 8081:80
    links:
      - db
    volumes:
      - nextcloud:/var/www/html
      - ./data:/var/www/html/data
    environment:
      - NEXTCLOUD_ADMIN_USER=${NEXTCLOUD_ADMIN_USER}
      - NEXTCLOUD_ADMIN_PASSWORD=${NEXTCLOUD_ADMIN_PASSWORD}
      - NEXTCLOUD_TABLE_PREFIX=${NEXTCLOUD_TABLE_PREFIX}
      - NEXTCLOUD_DATA_DIR=${NEXTCLOUD_DATA_DIR}
    restart: always

Спасибо.

2 ответа

Решение

Я понял, в чем проблема: неправильный путь в NEXTCLOUD_DATA_DIR,

Переменная среды NEXTCLOUD_DATA_DIR принимает путь к каталогу данных Nextcloud в контейнере, а не путь подключенного тома на хост-компьютере.

Решение: я заменил /home/iamdocker/nextcloud/data/ с /var/www/html/data в .env файл.

.env

MYSQL_ROOT_PASSWORD=***********************
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
MYSQL_PASSWORD=************************************
MYSQL_HOST=db

NEXTCLOUD_VERSION=13.0
NEXTCLOUD_ADMIN_USER=example
NEXTCLOUD_ADMIN_PASSWORD=********************************
NEXTCLOUD_TABLE_PREFIX=nc_
NEXTCLOUD_DATA_DIR=/var/www/html/data

Это решение устраняет возможность использования настраиваемого местоположения данных, эта ошибка возникает из-за того, что каталог настраиваемых данных не принадлежит пользователю, запускающему веб-сервер или PHP, в случае Apache в средах Debian пользователь-владелец должен быть www-data, а в среде CentOS это должно быть apache, давая правильные разрешения внутри контейнера или в зеркальном каталоге хоста, настройка местоположения данных должна работать безупречно.

Я всегда рекомендую удалить каталог данных из общедоступного каталога веб-сервера.

      chown -R www-data:www-data /dir

ИЛИ

      chown -R apache:apache /dir

CentOS + SELinux

Для совместимости с использованием SELinux :z ао финал сделать том

      services:
  app:
    volumes:
      - nextcloud:/var/www/html:z
      - ./data:/var/www/html/data:z

Моя проблема и решение

У меня была такая же проблема с разрешениями, однако в моем случае мне действительно нужно было изменить расположение файла по умолчанию. Но мне не хотелось иметь два файла (Dockerfile и docker-compose.yml), я хотел оставить только один для удобства копирования.

В моем docker-compose.yml я добавил команду со следующим утверждением

      services:
  app:
    command: >
      bash -c 'chown www-data:www-data /nextcloud-dados
      && /entrypoint.sh apache2-foreground'

Что я сделал, так это дал разрешение пользовательскому каталогу файлов при запуске контейнера.
Объясняя:

  • bash -c заставляет bash запускать определенную команду, мне пришлось ее использовать, потому что я использовал для них несколько команд и параметров;

  • chown www-data:www-data /nextcloud-dados, эта команда устраняет проблему с разрешениями. («дадос» - данные на бразильском португальском языке);

  • - это команда, которая фактически выполняет и поддерживает работу контейнера, эту информацию я получил из Docker Hub, где она показывает каждую команду, выполняемую внутри изображения. (Строки 44 и 45 )

Вы можете найти эту команду ( /entrypoint.sh apache2-foreground) также через docker ps --no-trunc команда в command столбец

Другие вопросы по тегам