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
столбец