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

llycmphe  于 2022-11-23  发布在  Solr
关注(0)|答案(3)|浏览(175)

我的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

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

Copying solr.xml
cp: cannot create regular file '/var/solr/data/solr.xml': Permission denied

我注意到,如果我在我的计算机上给予完全权限授予数据目录sudo chmod 777 ./data/solr/ -R,然后再次运行Docker,一切都很好。
我猜当solr用户不是我的机器时会出现这个问题,因为Docker使用root:root创建了data/solr文件夹。由于我的./data文件夹被忽略,我无法管理这些文件夹权限。
我想知道一种解决方法,以便正确管理权限,从而持久保存数据

mzaanser

mzaanser1#

这是一个已知的“问题”与docker-compose:Docker引擎创建的所有文件都归root:root所有。通常可以通过以下两种方法之一解决:
1.提前创建卷。在您的情况下,您可以提前创建./data/solr目录,并授予相应的权限。您可以让任何人都可以访问该目录,或者更好的做法是将其所有者更改为solr用户。solr用户和组ID硬编码在solr映像中:8983(停靠文件.template)

mkdir -p ./data/solr
sudo chown 8983:8983 ./data/solr

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
4sup72z8

4sup72z82#

使用Dockerfile设置

这可能不是你想要的,因为文件在重建容器时不会被保存,但它解决了“权限”问题。复制文件并使用Dockerfile来改变它们的所有权:

FROM solr:8.7.0
COPY --chown=solr ./data /var/solr/data

如果您尝试初始化单个内核,这将更有用:

FROM solr:8.7.0
COPY --chown=solr ./core /var/solr/data/someCollection

它还有一个优点,即您可以创建一个可重复使用的映像。

使用命名卷

为了实现持久性,您还可以创建一个卷(在本例中为core)并复制一个目录(在此也称为core)的内容,同时为文件分配权限:

docker container create --name temp -v core:/data tianon/true || exit $?
tar -cf - --directory core --owner 8983 --group 8983 . | docker cp - temp:/data
docker rm temp

这是根据以下答案改编的:

然后,您可以在Docker合成文件中装载命名宗卷:

version: '3'
services:
  solr:
    image: solr:8.7.0
    networks:
      - internal
    ports:
      - 8983:8983
    volumes:
      - core:/var/solr/data/someCollection

volumes:
  core:
    external: true

这个解决方案持久化数据而不覆盖主机上的数据。它不需要额外的构建步骤。显然可以适用于挂载整个/var/solr/data文件夹。
挂载的卷/目录没有正确的权限似乎并不重要(/var/solr/data/someCollection拥有所有者root:root)。

vs3odd8k

vs3odd8k3#

仅限Docker-compose的解决方案:)

问题

Docker使用root权限挂载本地文件夹。
在Solr的docker映像中,默认用户是solr-这是有充分理由的:Solr命令应该使用此用户运行(您可以强制使用root运行它们,但不建议这样做)。
大多数Solr命令需要对/var/solr/的写入权限,以存储数据和日志。
在此上下文中,当您以solr用户身份运行solr命令时,会被拒绝,因为您没有对/var/solr/的写入权限。

溶液

您可以先以root用户身份启动容器来更改/var/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"

相关问题