Dockerfile如下:主要是安装solr,并且安装分词器,不想手动配置分词器
FROM solr:8.6.2
MAINTAINER zhenhunfan <564090302@qq.com>
# 创建 Core
USER root #因为下面要创建目录,没有权限,因此用root用户
WORKDIR /var/solr/data
RUN mkdir ik_core
WORKDIR /var/solr/data/ik_core
RUN echo 'name=ik_core' > core.properties
RUN mkdir data
COPY data /var/solr/data/ik_core/data
RUN mkdir conf
COPY conf /var/solr/data/ik_core/conf
# 安装中文分词
WORKDIR /opt/solr-8.6.2/server/solr-webapp/webapp/WEB-INF/lib/
ADD ik-analyzer-8.3.0.jar .
ADD ik-analyzer-solr7-7.x.jar .
ADD solr-dataimporthandler-8.4.0.jar .
ADD solr-dataimporthandler-extras-8.4.0.jar .
WORKDIR /opt/solr-8.6.2/server/solr-webapp/webapp/WEB-INF
RUN mkdir classes
WORKDIR /opt/solr-8.6.2/server/solr-webapp/webapp/WEB-INF/classes
ADD ext.dic .
ADD stopword.dic .
ADD IKAnalyzer.cfg.xml .
RUN cp /opt/solr-8.6.2/contrib/analysis-extras/lucene-libs/lucene-analyzers-smartcn-8.6.2.jar /opt/solr-8.6.2/server/solr-webapp/webapp/WEB-INF/lib/
# 增加分词配置
COPY managed-schema /var/solr/data/ik_core/conf
COPY solrconfig.xml /var/solr/data/ik_core/conf
COPY core.properties /var/solr/data/ik_core
RUN chown -R solr:solr /var/solr/data/ik_core/
USER solr
WORKDIR /opt/solr-8.6.2
docker-compose.yml如下:
version: '3.1'
services:
solr:
build: ikanalyzer
restart: always
container_name: solr
ports:
- 8983:8983
volumes:
- ./solrdata:/opt/solrdata
但是跑起来后,发现RUN chown -R solr:solr /var/solr/data/ik_core 不起作用,所有者还是root,不知道该怎么办了
RUN 是在 build 镜像时执行的,不是在容器运行时执行的。容器运行时就是 root 账号,没必要改所有者。
不对吧,照这么说的话,连mkdir 都运行不了了,而且我感觉运行时并不是root账号,而是要看基于的镜像,我这个就不是root,因为mkdir 的时候报权限不足,你看我Dockerfile里用USER root 切换账号的
@镇魂帆2: 参考 why doesn't chown work in Dockerfile?
@dudu: 不是很明白,我没有声明卷啊
@镇魂帆2: Dockerfile 中不加 chown -R solr:solr /var/solr/data/ik_core/
,容器运行时会报什么错?
@dudu: Unable to create core [ik_core],java.nio.file.AccessDeniedException: /var/solr/data/ik_core/data/index/write.lock,因为运行时的用户是solr,并不是root,所以我才chown 为solr
@镇魂帆2: 在 docker-compose.yml 中指定 user 试试,参考 Running a Docker container as a non-root user
@dudu: 不指定,默认就是solr,指定为root后,会运行不了,报一个安全问题
@镇魂帆2: 试试容器启动时运行 sudo chown -R solr:solr /var/solr/data/ik_core/
@dudu: 我本意是想简单的一条命令,启动一个solr + ik,运行容器后再执行命令当然可以,但是这违反我本意了
@镇魂帆2: 报什么安全错误?
@dudu: Starting Solr as the root user is a security risk and not considered best practice. Exiting.
用root 用户,就直接退出了
@镇魂帆2: 从你提供的 Dockerfile 文件看,chown -R solr:solr /var/solr/data/ik_core/
之前漏掉了 RUN
命令
@dudu: 我提供的错了,但是我本地跑的还是对的,我本地是有RUN的
也跑起来了
但是进容器后,发现还是root
@镇魂帆2: 建议试试将 RUN chown -R solr:solr /var/solr/data/ik_core/
移至 RUN mkdir ik_core
之后
@dudu: 试过了,不行,一开始就是你说的,后来我把它挪到下面,就现在这样,还是不行
@镇魂帆2: 通过 COPY
命令的 --chown
参数可以搞定,比如下面的 Dockerfile
FROM solr:8.6.2
WORKDIR /var/solr/data/
COPY --chown=solr:solr ik_core /var/solr/data/ik_core
@dudu: 试过,可以了,谢谢
@dudu: 厉害厉害,我也解决了
@dudu: 但是我还是不明白, COPY 加 --chown 参数和 先copy 再去 chown 有什么区别呢
@dudu: 我百度了一下
dockerfile copy --chown 和 先COPY 再 chown 有何区别
在Dockerfile中,COPY --chown 和 COPY 后再 chown 的主要区别在于执行的时机和结果。
使用 COPY --chown:
这是一个原子操作,在文件被复制到镜像中的同一时间就指定了文件的所有权。如果在复制过程中发生错误,比如文件不存在,则整个操作会失败。
先 COPY 然后 chown:
这需要两个指令,因此,如果在 COPY 之后、chown 之前容器遭到攻击或者出现错误,文件可能已经被复制到镜像中但没有改变所有权。
https://github.com/docker-solr/docker-solr/blob/master/8.6/Dockerfile 容器的dockerfile中有修改权限的地方 0:0这种就是root用户
和你设置的可能有关联
你说的,和上面的dudu,一开始一样,但我没有设置卷,和我的情况不一样