Docker 的 Nextcloud:无法创建或写入数据目录
Nextcloud with Docker: Can't create or write into the data directory
我使用 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 的存储空间 space。我正在尝试设置 Nextcloud 以将上传的文件存储到主机上的 /home/iamdocker/nextcloud/data
,但它不起作用。
Nextcloud 配置页面显示以下消息:
Error
Can't create or write into the data directory
/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
文件中用 /var/www/html/data
替换了 /home/iamdocker/nextcloud/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 服务器 public 目录中删除数据目录
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
我的问题及解决方案
我遇到了同样的权限问题,但就我而言,我确实需要更改默认文件位置。
但是我不想有两个文件(Docker文件和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
是实际执行并保持容器 运行ning 的命令,这个信息我从 Docker Hub 得到的,它显示了每个命令在图像内部执行。 (Lines 44 and 45)
您也可以通过 command
列中的 docker ps --no-trunc
命令找到此命令 (/entrypoint.sh apache2-foreground
)
我使用 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 的存储空间 space。我正在尝试设置 Nextcloud 以将上传的文件存储到主机上的 /home/iamdocker/nextcloud/data
,但它不起作用。
Nextcloud 配置页面显示以下消息:
Error
Can't create or write into the data directory /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
文件中用 /var/www/html/data
替换了 /home/iamdocker/nextcloud/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 服务器 public 目录中删除数据目录
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
我的问题及解决方案
我遇到了同样的权限问题,但就我而言,我确实需要更改默认文件位置。 但是我不想有两个文件(Docker文件和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
是实际执行并保持容器 运行ning 的命令,这个信息我从 Docker Hub 得到的,它显示了每个命令在图像内部执行。 (Lines 44 and 45)
您也可以通过 command
列中的 docker ps --no-trunc
命令找到此命令 (/entrypoint.sh apache2-foreground
)