下一篇 使用 Docker 的云:无法创建或写入数据目录



我使用 Docker 和 Docker Compose 成功安装了 Nextcloud 13.0。

以下是Nextcloud的Docker镜像的GitHub存储库: https://github.com/nextcloud/docker

默认情况下,我的 Nextcloud 安装将数据存储到以下路径:

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

我的/var文件夹位于一个小分区上/home而文件夹有大约2Tb的存储空间。我正在尝试设置 Nextcloud 以将上传的文件存储在主机上的/home/iamdocker/nextcloud/data,但它不起作用。

"下一步云配置"页面显示以下消息:

错误

无法创建或写入数据目录/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/

docker-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

谢谢。

我弄清楚了问题所在:NEXTCLOUD_DATA_DIR路径错误。

环境变量NEXTCLOUD_DATA_DIR采用容器中 Nextcloud 数据目录的路径,而不是主机上装载卷的路径。

解决方案:我在.env文件中将/home/iamdocker/nextcloud/data/替换为/var/www/html/data

.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

此解决方案消除了使用自定义数据位置的可能性,发生此错误是因为自定义数据目录不属于运行 Web 服务器或 PHP 的用户,在 Debian 环境中的 Apache 情况下,所有者用户必须www-data,而在 CentOS 环境中应该apache,在容器内或主机镜像目录上授予正确的权限, 自定义数据的位置应该可以完美运行。

我总是建议从 Web 服务器公共目录中删除数据目录

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,此命令是解决权限问题的方法。("dados"是巴西葡萄牙语的数据(;

  • /entrypoint.sh apache2-foreground是实际执行并保持容器运行的命令,这些信息是我从 Docker Hub 获得的,它显示了在映像中执行的每个命令。(第 44 和 45 行(

您也可以通过command列中的docker ps --no-trunc命令找到此命令(/entrypoint.sh apache2-foreground(

最新更新