我有一个使用以下Dockerfile
FROM ubuntu
RUN useradd -ms /bin/bash seltest
RUN mkdir /home/seltest/output
RUN touch /home/seltest/output/test.out
WORKDIR /home/seltest
RUN chown -R seltest:seltest .
COPY script.sh /home/seltest
USER seltest
CMD ["bash", "script.sh"]
实质上是创建一个新用户seltest
,然后执行脚本script.sh
:
echo 'test' > /home/seltest/output/test.out
我使用以下命令创建docker映像
docker build -f Dockerfile -t testimage .
并使用以下命令在主机上运行它:
docker run --rm -it -v ${PWD}/output:/home/seltest/output testimage
但出现错误
script.sh: line 1: /home/seltest/output/test.out: Permission denied
我先前创建的名为output
的本地文件夹为空。
为什么会出现此错误?如何设置docker用户seltest
可以写入的共享文件夹?我在这里做什么错了?
答案 0 :(得分:1)
您从主机操作系统挂载了/home/seltest/output/
,因此它具有主机操作系统的权限和所有权。使其对所有人都可写,并且容器中不会出现问题:
$ chmod 777 ${PWD}/output
$ docker run --rm -it -v ${PWD}/output:/home/seltest/output testimage
当然,当您以更好的粒度配置写许可权时,更安全的选择将是不写全部。这可能是一个问题,因为用户seltest
仅存在于容器中。更好的选择是在创建seltest
用户时,如果还定义了用户ID,则将允许在目录${PWD}/output
上对该用户ID进行写访问。
答案 1 :(得分:1)
我将您的dockerfile更改为以下文件
FROM ubuntu
RUN useradd -ms /bin/bash seltest
RUN mkdir /home/seltest/output
RUN touch /home/seltest/output/test.out
WORKDIR /home/seltest
COPY script.sh /home/seltest
RUN chmod +x /home/seltest/script.sh
RUN chown -R seltest:seltest .
USER seltest
CMD ["bash", "script.sh"]
我做了什么?
在更改home子内容的所有者之前,请设置脚本副本。这是为了避免脚本上的权限问题。
仍然拒绝许可 运行此命令后,您仍然会遇到权限被拒绝的问题
docker run --rm -it -v ${PWD}/output:/home/seltest/output testimage
原因和可能的解决方案
这是因为您容器内的用户对从主机系统中装入的文件夹具有无写入访问权限。 要解决此问题,您可以: