首页 新闻 会员 周边 捐助

Dockerfile里执行RUN chown 不起作用?

-1
悬赏园豆:200 [已解决问题] 解决于 2020-09-27 13:18

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,不知道该怎么办了

镇魂帆-张的主页 镇魂帆-张 | 初学一级 | 园豆:6
提问于:2020-09-25 17:28
< >
分享
最佳答案
0

RUN 是在 build 镜像时执行的,不是在容器运行时执行的。容器运行时就是 root 账号,没必要改所有者。

收获园豆:200
dudu | 高人七级 |园豆:30778 | 2020-09-25 19:10

不对吧,照这么说的话,连mkdir 都运行不了了,而且我感觉运行时并不是root账号,而是要看基于的镜像,我这个就不是root,因为mkdir 的时候报权限不足,你看我Dockerfile里用USER root 切换账号的

镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 08:29
dudu | 园豆:30778 (高人七级) | 2020-09-27 08:37

@dudu: 不是很明白,我没有声明卷啊

镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 08:43

@镇魂帆2: Dockerfile 中不加 chown -R solr:solr /var/solr/data/ik_core/ ,容器运行时会报什么错?

dudu | 园豆:30778 (高人七级) | 2020-09-27 09:04

@dudu: Unable to create core [ik_core],java.nio.file.AccessDeniedException: /var/solr/data/ik_core/data/index/write.lock,因为运行时的用户是solr,并不是root,所以我才chown 为solr

镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 09:07

@镇魂帆2: 在 docker-compose.yml 中指定 user 试试,参考 Running a Docker container as a non-root user

dudu | 园豆:30778 (高人七级) | 2020-09-27 09:15

@dudu: 不指定,默认就是solr,指定为root后,会运行不了,报一个安全问题

镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 09:22

@镇魂帆2: 试试容器启动时运行 sudo chown -R solr:solr /var/solr/data/ik_core/

dudu | 园豆:30778 (高人七级) | 2020-09-27 10:05

@dudu: 我本意是想简单的一条命令,启动一个solr + ik,运行容器后再执行命令当然可以,但是这违反我本意了

镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 10:14

@镇魂帆2: 报什么安全错误?

dudu | 园豆:30778 (高人七级) | 2020-09-27 10:24

@dudu: Starting Solr as the root user is a security risk and not considered best practice. Exiting.
用root 用户,就直接退出了

镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 10:30

@镇魂帆2: 从你提供的 Dockerfile 文件看,chown -R solr:solr /var/solr/data/ik_core/ 之前漏掉了 RUN 命令

dudu | 园豆:30778 (高人七级) | 2020-09-27 10:39

@dudu: 我提供的错了,但是我本地跑的还是对的,我本地是有RUN的

也跑起来了

但是进容器后,发现还是root

镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 10:45

@镇魂帆2: 建议试试将 RUN chown -R solr:solr /var/solr/data/ik_core/ 移至 RUN mkdir ik_core 之后

dudu | 园豆:30778 (高人七级) | 2020-09-27 10:54

@dudu: 试过了,不行,一开始就是你说的,后来我把它挪到下面,就现在这样,还是不行

镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 10:55

@镇魂帆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 | 园豆:30778 (高人七级) | 2020-09-27 12:29

@dudu: 试过,可以了,谢谢

镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 13:18

@dudu: 厉害厉害,我也解决了

丁耀庭 | 园豆:200 (初学一级) | 2024-06-05 17:58

@dudu: 但是我还是不明白, COPY 加 --chown 参数和 先copy 再去 chown 有什么区别呢

丁耀庭 | 园豆:200 (初学一级) | 2024-06-05 17:59

@dudu: 我百度了一下

dockerfile copy --chown 和 先COPY 再 chown 有何区别
在Dockerfile中,COPY --chown 和 COPY 后再 chown 的主要区别在于执行的时机和结果。

使用 COPY --chown:

这是一个原子操作,在文件被复制到镜像中的同一时间就指定了文件的所有权。如果在复制过程中发生错误,比如文件不存在,则整个操作会失败。

先 COPY 然后 chown:

这需要两个指令,因此,如果在 COPY 之后、chown 之前容器遭到攻击或者出现错误,文件可能已经被复制到镜像中但没有改变所有权。

丁耀庭 | 园豆:200 (初学一级) | 2024-06-05 18:02
其他回答(1)
1

https://github.com/docker-solr/docker-solr/blob/master/8.6/Dockerfile 容器的dockerfile中有修改权限的地方 0:0这种就是root用户
和你设置的可能有关联

2012 | 园豆:21645 (高人七级) | 2020-09-27 10:54

你说的,和上面的dudu,一开始一样,但我没有设置卷,和我的情况不一样

支持(1) 反对(0) 镇魂帆-张 | 园豆:6 (初学一级) | 2020-09-27 10:57
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册