如何在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
原因和可能的解决方案
这是因为容器中的用户对从主机系统装载的文件夹没有写入权限。
要解决此问题,您可以:
我将您的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
原因和可能的解决方案
这是因为容器中的用户对从主机系统装载的文件夹没有写入权限。
要解决此问题,您可以:
不,我不希望脚本以root用户身份执行。我希望脚本以普通用户的身份运行否,我不希望脚本以root用户的身份执行。我希望脚本以普通用户的身份运行。是的,它可以工作。但最终我需要在詹金斯的工作中做到这一点。我希望在那里也能奏效!记住,数字用户ID在这里很重要;主机和容器中的用户名称实际上并不重要。是的,这很有效。但最终我需要在詹金斯的工作中做到这一点。我希望在那里也能奏效!记住,数字用户ID在这里很重要;主机和容器中的用户名称实际上并不重要。