Docker 文件和卷 权限拒绝

一 创作背景

        再复制Docker影像文件或访问Docker容器内已安装卷上的文件时我们常常会遇到:“权限被拒绝”的错误,在此,您将了解到为什么会出现“权限被拒绝”的错误以及如何解决这个问题。

二 目的

        在深入探讨 Docker 容器中的 Permission Denied问题之前,最好了解 Linux 中权限的基本知识。如果您已经熟悉这些概念,则可以跳过本段。可以在 Ubuntu 文档和这个关于umask的优秀解释 中找到熟悉权限的一个很好的起点,如果您想要快速总结,请继续。

三  简介

        我们创建一个目录

mkdir publish_test

        我们查看一下该文件的权限

ls -la

        输出内容如下 

drwxrwxrwx   3 root root 4096 Dec 20 16:23 publish_2023

        让我们从左往右检查一下这里列出的项目 

d表示这是一个目录
rwx所有者的权限,在这种情况下,所有者具有读取、写入和执行权限。
rwx

组的权限。用户属于一个或多个组。在这种情况下,权限与所有者的权限相同。

rwx

其他人的权限:在这种情况下,任何其他人,无论是所有者还是不属于该组,都将具有读取、写入和

执行权限。

root该目录由该用户所有。在后台,这个逻辑名称被映射到一个用户id(uid)。当您只有一个用户时。这可能是uid1000
root该目录由该组所有。在后台,这个逻辑名称被映射到一个组id(gid)。你的gid可能是1000。

        ok,我们继续创建一个txt文件,然后我们查看该文件拥有的权限。

        进入该目录

cd /usr/local/publish_test

        创建文件defaultfilepermissions.txt,并查看文件权限

touch defaultfilepermissions.txt
ls -la

        输出内容如下:

drwxr-xr-x   2 root root 4096 Dec 21 11:10 .
drwxr-xr-x. 22 root root 4096 Dec 21 10:56 ..
-rw-r--r--   1 root root    0 Dec 21 11:10 defaultfilepermissions.txt

权限的列出方式与目录类似。没有 d 第一项,因为它当然不是目录,并且文件没有任何执行权限

三  先决条件

        安装docker

        查看用户组

四 以Root身份运行容器

我们在/usr/local/publish_test目录下创建一个Dockerfile,DockerFile的内容如下:

FROM alpine:3.16.2
COPY defaultfilepermissions.txt /tmp/defaultfilepermissions.txt

该 FROM指令将使用 Alpine Linux 3.16.2 基础 Docker 映像,并且该 COPY指令会将本地defaultfilepermissions.txt文件复制到位于 location 的 Docker 映像中 /tmp/defaultfilepermissions.txt。

 构建Docker映像

cd /usr/local/publish_test
sudo docker build -f Dockerfile -t dockertest .

输出内容如下:

然后我们以交互模式启动Docker容器,以方便我们能够继续使用shell

sudo docker run  --name dockercontainer --rm -it dockertest /bin/sh

 输出内容如下

[root@iZ2ze6on3jy8afby5yaj0bZ publish_test]# sudo docker run  --name dockercontainer --rm -it dockertest /bin/sh
/ # 

进入tmp目录 

cd tmp

查看tmp目录中的文件 

ls

 尝试执行cat  defaultfilepermissions.txt,查看输出内容

cat defaultfilepermissions.txt

 我们可以看到我们文件的内容

然后我们使用vi命令,发现文件也是可以被编辑的。这些结果都是合乎逻辑的,root用户执行它们,root可以做任何事情。

键入 exit ,退出shell

我们删除Docker映像

sudo docker rmi dockertest

 

五 以用户1000运行容器

此测试与第一个测试类似,不同之处在于您将为Docker容器创建一个用户,这样,容器将不再以root身份用户运行,这是一种更安全的容器运行方式。

还是在该目录下(/usr/local/publish_test),我们修改Dockerfile。

内容如下:

FROM alpine:3.16.2
RUN addgroup --g 1000 groupcontainer
RUN adduser -u 1000 -G groupcontainer -h /home/containeruser -D containeruser

USER containeruser
COPY defaultfilepermissions.txt /tmp/defaultfilepermissions.txt

该dockerfile的解释如下:

使用 gid 1000 创建RUN addgroup一个组,

groupcontainer,使用 RUN adduser,containeruser创建一个 uid 为 1000 的用户 属于组 groupcontainer和主目录 /home/containeruser

USER containeruser,容器与用户一起运行 containeruser;

本地 defaultfilepermissions.txt文件被复制到 containeruser.

我们继续使用之前的命令,构建并运行容器

sudo docker build -f Dockerfile -t dockertest .

输出内容如下:

继续用 交互模式启动Docker容器,以方便我们能够继续使用shell

sudo docker run  --name dockercontainer --rm -it dockertest /bin/sh

/ $ cd tmp
/tmp $ ls
defaultfilepermissions.txt
/tmp $ cat defaultfilepermissions.txt
11111111111111111111111111111111111111111111111111111111111111111111111/tmp $ 

 尝试执行 cat test.txt,你会注意到文件的内容被输出了。可以这样做,因为 other具有读取权限。请记住,容器 containeruser现在以用户身份运行。

我们尝试用vi去编辑并且保存文件,这是不可能的:会发出警告,指出该文件是只读的。那是因为 other没有写权限。

ps:

  1. 你可以使用 vi 编辑器来编辑文件。 运行以下命令: vi /path/to/file ...
  2. 在 vi 编辑器中,按下 i 进入插入模式,然后进行编辑。 完成后,按下 Esc 键退出插入模式。
  3. 要保存文件并退出 vi 编辑器,请输入以下命令: :wq 这将保存文件并退出编辑器。
  4. 退出容器的交互式模式,请输入以下命令: exit

删除Docker映像

sudo docker rmi dockertest

六 以用户1024运行容器并更改所有权

您将解决权限问题,诀窍是将文件的所有权更改为运行 Docker 容器的用户。创建一个目录4-containeruser1024changedowner。是Dockerfile:

FROM alpine:3.16.2

RUN addgroup --g 1024 groupcontainer
RUN adduser -u 1024 -G groupcontainer -h /home/containeruser -D containeruser

USER containeruser

COPY --chown=containeruser:groupcontainer defaultfilepermissions.txt /home/containeruser/defaultfilepermissions.txt

我们可以看到在Copy行,文件的所有权 test.txt更改为用户 containeruser和组 groupcontainer。 

像以前一样构建并运行容器。导航到用户的主目录containeruser并列出文件

尝试执行 cat test.txt,你会注意到文件的内容被输出了。

尝试编辑文件 vi并保存文件。这是允许的,因为这一次, containeruser拥有该文件并具有适当的写入权限。

删除Docker 映像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/291808.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SpringCloudGateway网关处拦截并修改请求

SpringCloudGateway网关处拦截并修改请求 需求背景 老系统没有引入Token的概念,之前的租户Id拼接在请求上,有的是以Get,Param传参形式;有的是以Post,Body传参的。需要在网关层拦截请求并进行请求修改后转发到对应服务。…

​ SK Ecoplant借助亚马逊云科技,海外服务器为环保事业注入新活力

在当今全球面临着资源紧缺和环境挑战的大背景下,数字技术所依赖的海外服务器正成为加速循环经济转型的关键利器。然而,很多企业在整合数字技术到运营中仍然面临着一系列挑战,依然存在低效流程导致的不必要浪费。针对这一问题,SK E…

工具系列:PyCaret介绍_用外生变量单变量时间序列预测

工具系列:PyCaret介绍_用外生变量单变量时间序列预测 在这组笔记本中,我们将介绍使用外生变量进行建模。我们的行动计划如下: 对数据集进行探索性数据分析,以提取关于生成时间序列的过程的有价值的见解。 构建一个基准模型&…

元旦厦门游--ChatGPT/GPT4科研实践应用与AI绘图技术

2023年我们进入了AI2.0时代。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车,就有可能被淘汰在这个数字化时代,如何能高效地处理文本、文献查阅、PPT…

YOLOv8改进 | 主干篇 | 利用MobileNetV2替换Backbone(轻量化网络结构)

一、本文介绍 本文给大家带来的改进机制是MobileNetV2,其是专为移动和嵌入式视觉应用设计的轻量化网络结构。其在MobilNetV1的基础上采用反转残差结构和线性瓶颈层。这种结构通过轻量级的深度卷积和线性卷积过滤特征,同时去除狭窄层中的非线性&#xff…

力扣每日一题day37[113.路径总和ii]

给你二叉树的根节点 root 和一个整数目标和 targetSum ,找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1: 输入:root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&a…

lamda表达式(史上最全)

一、函数式接口 在jdk8中什么是函数式接口: 被FunctionalInterface注解修饰的。接口里边只有一个非default的方法。 满足以上2个条件的即为函数式接口,ps:即使一个接口没有FunctionalInterface修饰,但是满足2,那么这…

Netty Review - Netty与Protostuff:打造高效的网络通信

文章目录 概念PrePomServer & ClientProtostuffUtil 解读测试小结 概念 Pre 每日一博 - Protobuf vs. Protostuff&#xff1a;性能、易用性和适用场景分析 Pom <dependency><groupId>com.dyuproject.protostuff</groupId><artifactId>protostuff-…

打破Tomcat中的双亲委派机制:探讨与实践

目录 引言 1. 双亲委派机制概述 2. 打破双亲委派机制的场景 3. Tomcat中的类加载器体系 4. 打破双亲委派机制的方法 4.1 在catalina.properties中配置common.loader 4.2 在META-INF/context.xml中配置Loader元素 4.3 编写自定义的类加载器 5. 潜在的问题与解决方案 5…

Android13 Wifi启动流程分析

Android13 Wifi启动流程分析 文章目录 Android13 Wifi启动流程分析一、正常开关wifi 启动流程1、WifiManager2、WifiServiceImpl3、ActiveModeWarden4、ConcreteClientModeManager5、WifiNative6、WifiVendorHal7、HalDeviceManager8、wifi.cpp 二、重启设备时自动开启wifi流程…

关于LayUI弹出层表单提交两次问题

在弹出层点击 注册 按钮表单会提交两次 但是在单独页面点击是正常的 经过排查发现&#xff0c;问题在于主页面和注册页面重复引用了layui.js&#xff0c;页面要被渲染两次 <script src"../layui/layui.js"></script>

【IntelliJ IDEA】打开项目Git突然无法识别解决方案

这个问题也是我今天突然偶尔遇到的&#xff0c;当时没在意&#xff0c;项目打开之后又关闭&#xff0c;后来很久才又打开&#xff0c;发现项目明明有git版本控制的&#xff0c;咋突然开发工具右下角没有标识了&#xff0c;然后检查了一下git配置还报错了。 其实从图上我们可以看…