如何在docker映像中写入文件?

如何在docker映像中写入文件?,docker,Docker,我使用以下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

我使用以下
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用户可以写入的共享文件夹?我做错了什么?

您从主机操作系统装载
/home/seltest/output/
,因此它具有主机操作系统的权限和所有权。让它对每个人都可写,您就不会在容器中遇到问题:

$ chmod 777 ${PWD}/output
$ docker run --rm  -it  -v ${PWD}/output:/home/seltest/output testimage

当然,当您以更好的粒度配置写权限时,更安全的选择将是,而不是为所有人写。这可能是个问题,因为用户
seltest
仅存在于容器中。更好的选择是,如果在创建
seltest
user时还定义了用户id,那么您将允许对目录
${PWD}/output
级别上的该用户id进行写访问

您从主机操作系统装载
/home/seltest/output/
,因此它具有主机操作系统的权限和所有权。让它对每个人都可写,您就不会在容器中遇到问题:

$ chmod 777 ${PWD}/output
$ docker run --rm  -it  -v ${PWD}/output:/home/seltest/output testimage

当然,当您以更好的粒度配置写权限时,更安全的选择将是,而不是为所有人写。这可能是个问题,因为用户
seltest
仅存在于容器中。更好的选择是,如果在创建
seltest
user时还定义了用户id,那么您将允许对目录
${PWD}/output
级别上的该用户id进行写访问

我将您的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"]
我做了什么?

在更改主目录子内容的所有者之前设置脚本副本。这是为了避免脚本上的权限问题

权限仍然被拒绝 运行此操作后,执行时仍会出现权限被拒绝的问题

docker run --rm  -it  -v ${PWD}/output:/home/seltest/output testimage
原因和可能的解决方案

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

  • 给chmod 643${PWD}/输出
  • 在主机系统上创建用户,然后在容器中创建具有相同UID的用户
  • 为在主机系统上具有UID 1000的用户提供对文件夹的写访问权限:运行useradd-u${UID}-ms/bin/bash seltest
  • 使用容器中的用户nobody并将主机文件夹中的组权限设置为nobody。在主机上设置权限可以由jenkins或docker准备映像来完成,该映像可以启动、更改组、关闭

  • 我将您的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"]
    
    我做了什么?

    在更改主目录子内容的所有者之前设置脚本副本。这是为了避免脚本上的权限问题

    权限仍然被拒绝 运行此操作后,执行时仍会出现权限被拒绝的问题

    docker run --rm  -it  -v ${PWD}/output:/home/seltest/output testimage
    
    原因和可能的解决方案

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

  • 给chmod 643${PWD}/输出
  • 在主机系统上创建用户,然后在容器中创建具有相同UID的用户
  • 为在主机系统上具有UID 1000的用户提供对文件夹的写访问权限:运行useradd-u${UID}-ms/bin/bash seltest
  • 使用容器中的用户nobody并将主机文件夹中的组权限设置为nobody。在主机上设置权限可以由jenkins或docker准备映像来完成,该映像可以启动、更改组、关闭

  • 不,我不希望脚本以root用户身份执行。我希望脚本以普通用户的身份运行否,我不希望脚本以root用户的身份执行。我希望脚本以普通用户的身份运行。是的,它可以工作。但最终我需要在詹金斯的工作中做到这一点。我希望在那里也能奏效!记住,数字用户ID在这里很重要;主机和容器中的用户名称实际上并不重要。是的,这很有效。但最终我需要在詹金斯的工作中做到这一点。我希望在那里也能奏效!记住,数字用户ID在这里很重要;主机和容器中的用户名称实际上并不重要。