【问题标题】:Nextcloud with Docker: Can't create or write into the data directoryNextcloud 与 Docker:无法创建或写入数据目录
【发布时间】:2018-12-13 18:11:27
【问题描述】:

我使用 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,但它不起作用。

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/

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

谢谢。

【问题讨论】:

    标签: docker permissions docker-compose containers nextcloud


    【解决方案1】:

    我发现了问题所在: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
    

    【讨论】:

      【解决方案2】:

      此解决方案消除了使用自定义数据位置的可能性,出现此错误是因为自定义数据目录不属于运行 Web 服务器或 PHP 的用户,对于 Debian 环境中的 Apache,所有者用户必须是 @ 987654322@,在 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 获得了这些信息,其中显示了在映像中执行的每个命令。 (Lines 44 and 45)

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

      【讨论】:

        猜你喜欢
        • 2019-05-24
        • 2021-06-02
        • 1970-01-01
        • 2020-07-24
        • 1970-01-01
        • 1970-01-01
        • 2020-02-10
        • 2018-09-07
        • 2015-03-08
        相关资源
        最近更新 更多