一、故障表现
Dockerfile 如下
FROM eclipse-temurin:11
MAINTAINER yinwenbin@rhuassurance.com
RUN useradd mservice
# 工作目录
ENV APP_HOME /apps
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
VOLUME $APP_HOME/logs
VOLUME $APP_HOME/config
ARG JAR_FILE=target/*.jar
COPY $JAR_FILE .
COPY ./docker-entrypoint.sh .
RUN chown -R mservice:mservice $APP_HOME && chmod +x ./docker-entrypoint.sh
USER mservice:mservice
ENTRYPOINT ["./docker-entrypoint.sh"]
EXPOSE 8080/tcp
在容器中,VOLUME目录表现为root。即便 chown也没有用。导致容器内app写入失败。
[root@localhost ~]# docker exec -it test /bin/bash
mservice@e45cc10d4914:/apps$ ls -l
total 8
drwxr-xr-x. 2 root root 6 Nov 14 08:13 config
-rwxr-xr-x. 1 mservice mservice 1552 Nov 14 06:59 docker-entrypoint.sh
drwxr-xr-x. 2 root root 6 Nov 14 08:13 logs
-rw-r--r--. 1 mservice mservice 2753 Nov 14 06:29 test.jar
使用
-v
和--mount
,也是一样的
二、解决方案一: 容器内服务以root运行
docker run -it --rm -v /docker_data/test/logs/:/apps/logs/ --name test test
docker run -it --rm -v /docker_data/test/logs/:/apps/logs/ -v /docker_data/test/config/:/apps/config/ --name test test
三、解决方案二: 在挂载成功后,通过脚本修改属性
四、rootless docker mode
五、git issue 2259
https://stackoverflow.com/questions/33681396/how-do-i-write-to-a-volume-container-as-non-root-in-docker
https://github.com/moby/moby/issues/2259
这个问题到现在还没有解决掉。
网友评论