如何能够在Docker映像内的文件中进行写入?

时间:2019-04-04 12:26:38

标签: docker

我有一个使用以下Dockerfile

创建的docker映像
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可以写入的共享文件夹?我在这里做什么错了?

2 个答案:

答案 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

原因和可能的解决方案

这是因为您容器内的用户对从主机系统中装入的文件夹具有无写入访问权限。 要解决此问题,您可以:

  1. 提供chmod 643 $ {PWD} /输出
  2. 在主机系统上创建用户,然后在具有相同UID的容器内创建用户
  3. 授予主机系统上具有UID 1000的用户对该文件夹的写入权限: RUN useradd -u $ {UID} -ms / bin / bash seltest
  4. 在容器中使用用户nobody,并将主机文件夹中的组权限设置为nobody。可以通过jenkins或通过启动,更改组​​,关闭的Docker准备映像来设置主机上的权限