我的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
文件夹被忽略,我无法管理这些文件夹权限。
我想知道一种解决方法,以便正确管理权限,从而持久保存数据
3条答案
按热度按时间mzaanser1#
这是一个已知的“问题”与docker-compose:Docker引擎创建的所有文件都归root:root所有。通常可以通过以下两种方法之一解决:
1.提前创建卷。在您的情况下,您可以提前创建./data/solr目录,并授予相应的权限。您可以让任何人都可以访问该目录,或者更好的做法是将其所有者更改为
solr
用户。solr
用户和组ID硬编码在solr映像中:8983(停靠文件.template)1.如果你想避免在docker-compose之前运行额外的命令,你可以创建额外的容器来修复权限:
4sup72z82#
使用Dockerfile设置
这可能不是你想要的,因为文件在重建容器时不会被保存,但它解决了“权限”问题。复制文件并使用Dockerfile来改变它们的所有权:
如果您尝试初始化单个内核,这将更有用:
它还有一个优点,即您可以创建一个可重复使用的映像。
使用命名卷
为了实现持久性,您还可以创建一个卷(在本例中为
core
)并复制一个目录(在此也称为core
)的内容,同时为文件分配权限:这是根据以下答案改编的:
然后,您可以在Docker合成文件中装载命名宗卷:
这个解决方案持久化数据而不覆盖主机上的数据。它不需要额外的构建步骤。显然可以适用于挂载整个
/var/solr/data
文件夹。挂载的卷/目录没有正确的权限似乎并不重要(
/var/solr/data/someCollection
拥有所有者root:root)。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。