Docker 持久卷没有权限 (Apache Solr)

dev*_*bio 3 solr file-permissions docker docker-compose docker-volume

我的docker-compose.yml

solr:
    image: solr:8.6.2
    container_name: myproject-solr
    ports:
     - "8983:8983"
    volumes:
      - ./data/solr:/var/solr/data
    networks:
      static-network:
        ipv4_address: 172.20.1.42
Run Code Online (Sandbox Code Playgroud)

使用 启动 docker 后docker-compose up -d --build,solr 容器关闭,日志 ( docker logs myproject-solr) 显示:

Copying solr.xml
cp: cannot create regular file '/var/solr/data/solr.xml': Permission denied
Run Code Online (Sandbox Code Playgroud)

我注意到,如果我在我的机器上授予数据目录的完全权限sudo chmod 777 ./data/solr/ -R并再次运行 Docker,一切都很好。

我猜当solr用户不是我的机器时会出现问题,因为 Dockerdata/solr使用root:root. ./data忽略我的文件夹 gitignored,我无法管理这些文件夹权限。

我想知道一种解决方法来正确管理权限以保留数据

小智 8

docker-compose-only解决方案:)

问题

Docker 以 root 权限挂载本地文件夹。

在 Solr 的 docker 映像中,默认用户是solr- 有充分的理由:Solr 命令应该使用此用户运行(您可以强制使用root不建议运行它们)。

大多数 Solr 命令需要对/var/solr/, 进行数据和日志存储的写入权限。

在这种情况下,当您以用户身份运行 solr 命令时solr,您会被拒绝,因为您没有/var/solr/.

解决方案

您可以做的是首先以 root 身份启动容器来更改/var/solr/. 然后切换到solr用户来运行所有必要的 solr 命令。您无法启动我们的 Solr 服务器。

在下面的示例中,我们使用solr-precreate创建默认核心并启动 solr。

version: '3.7'

services:

  solr:
    image: solr:8.5.2
    volumes:
      - ./mnt/solr:/var/solr
    ports:
      - 8983:8983
    user: root # run as root to change the permissions of the solr folder
    # Change permissions of the solr folder, create a default core and start solr as solr user
    command: bash -c "
      chown -R 8983:8983 /var/solr
      && runuser -u solr -- solr-precreate default-core"
Run Code Online (Sandbox Code Playgroud)


Maf*_*for 6

这是 docker-compose 的一个已知“问题”:由 Docker 引擎创建的所有文件都归 root:root 所有。通常它通过以下两种方式之一解决:

  1. 提前创建卷。在您的情况下,您可以使用适当的权限提前创建 ./data/solr 目录。您可以让任何人都可以访问它,或者更好地将其所有者更改为solr用户。的solr用户ID和组ID被Solr的图像内的硬编码:8983(Dockerfile.template
mkdir -p ./data/solr
sudo chown 8983:8983 ./data/solr
Run Code Online (Sandbox Code Playgroud)
  1. 如果你想避免在 docker-compose 之前运行额外的命令,你可以创建额外的容器来修复权限:
version: "3"

services:

  initializer:
    image: alpine
    container_name: solr-initializer
    restart: "no"
    entrypoint: |
      /bin/sh -c "chown 8983:8983 /solr"
    volumes:
      - ./data/solr:/solr
    
  solr:
    depends_on: 
      - initializer
    image: solr:8.6.2
    container_name: myproject-solr
    ports:
     - "8983:8983"
    volumes:
      - ./data/solr:/var/solr/data  
    networks:
      static-network:
        ipv4_address: 172.20.1.42
Run Code Online (Sandbox Code Playgroud)