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 containeruserUSER 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:
- 你可以使用 vi 编辑器来编辑文件。 运行以下命令: vi /path/to/file ...
- 在 vi 编辑器中,按下 i 进入插入模式,然后进行编辑。 完成后,按下 Esc 键退出插入模式。
- 要保存文件并退出 vi 编辑器,请输入以下命令: :wq 这将保存文件并退出编辑器。
- 退出容器的交互式模式,请输入以下命令: 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 映像
相关文章:

Docker 文件和卷 权限拒绝
一 创作背景 再复制Docker影像文件或访问Docker容器内已安装卷上的文件时我们常常会遇到:“权限被拒绝”的错误,在此,您将了解到为什么会出现“权限被拒绝”的错误以及如何解决这个问题。 二 目的 在深入探讨 Docker 容器中的 Permission De…...

Appium Server 启动失败常见原因及解决办法
Error: listen EADDRINUSE: address already in use 0.0.0.0:4723 如下图: 错误原因:Appium 默认的4723端口被占用 解决办法: 出现该提示,有可能是 Appium Server 已启动,关闭已经启动的 Appium Server 即可。472…...

将Abp默认事件总线改造为分布式事件总线
文章目录 原理创建分布式事件总线实现自动订阅和事件转发 使用启动Redis服务配置传递Abp默认事件传递自定义事件 项目地址 原理 本地事件总线是通过Ioc容器来实现的。 IEventBus接口定义了事件总线的基本功能,如注册事件、取消注册事件、触发事件等。 Abp.Events…...

Jupyter Notebook修改默认工作目录
1、参考修改Jupyter Notebook的默认工作目录_jupyter文件路径-CSDN博客修改配置文件 2.在上述博客内容的基础上,这里不是删除【%USERPROFILE%】而是把这个地方替换为所要设置的工作目录路径, 3.【起始位置】也可以更改为所要设置的工作目录路径&#x…...

高校/企业如何去做数据挖掘呢?
随着近年来人工智能及大数据、云计算进入爆发时期,依托三者进行的数据分析、数据挖掘服务已逐渐成为各行业进行产业升级的载体,缓慢渗透进我们的工作和生活,成为新时代升级版的智能“大案牍术”。 那么对于多数企业来说,如何做数据…...

数据仓库-数据治理小厂实践
一、简介 数据治理贯穿数仓中数据的整个生命周期,从数据的产生、加载、清洗、计算,再到数据展示、应用,每个阶段都需要对数据进行治理,像有些比较大的企业都是有自己的数据治理平台或者会开发一些便捷的平台,对于没有平…...
【C++多线程编程】(五)之 线程生命周期管理join() 与 detach()
在C中,std::thread 类用于创建和管理线程。std::thread 提供了两种主要的方法来控制线程的生命周期:join 和 detach。 detach方式,启动的线程自主在后台运行,当前的代码继续往下执行,不等待新线程结束。join方式&…...
金融信贷场景的风险“要素”与主要“风险点”
目录 要素一:贷款对象 风险点1:为不具备主体资格或主体资格有瑕疵的借款人发放贷款 风险表现: 防控措施: 风险点2:向国家限控行业发放贷款 风险表现: 防控措施: 风险点3:受理不符合准入条件的客户申请 风险表现: 防控措施: 要素二:金额 风险点4:过渡授…...

ubuntu下docker安装,配置python运行环境
参考自: 1.最详细ubuntu安装docker教程 2.使用docker搭建python环境 首先假设已经安装了docker,卸载原来的docker 在命令行中运行: sudo apt-get updatesudo apt-get remove docker docker-engine docker.io containerd runc 安装docker依赖 apt-get…...
在Docker中安装kafka遇到问题记录
命令含义解答: 在docker安装kafka的时候,启动kafka的时候会执行下面语句: docker run -d --log-driver json-file --log-opt max-size100m --log-opt max-file2 --name kafka -p 9092:9092 -e KAFKA_BROKER_ID0 -e KAFKA_ZOOKEEPER_CONNEC…...

aws-waf-cdn 基于规则组的永黑解决方案
1. 新建waf 规则组 2. 为规则组添加规则 根据需求创建不同的规则 3. waf中附加规则组 (此时规则组所有规则都会附加到waf中,但是不会永黑) 此刻,可以选择测试下规则是否生效,测试前确认保护资源绑定无误 4. 创建堆…...

如何实现免费无限流量云同步笔记软件Obsidian?
目录 前言 如何实现免费无限流量云同步笔记软件Obsidian? 一、简介 软件特色演示: 二、使用免费群晖虚拟机搭建群晖Synology Drive服务,实现局域网同步 1 安装并设置Synology Drive套件 2 局域网内同步文件测试 三、内网穿透群晖Synol…...

GPTs | Actions应用案例
上篇文章说道,如何使用创建的GPTs通过API接口去获取外部的一些信息,然后把获取的外部信息返回给ChatGPT让它加工出来,回答你的问题,今天我们就来做一个通俗易懂的小案例,让大家来初步了解一下它的使用法! …...

Python Opencv实践 - 手势音量控制
本文基于前面的手部跟踪功能做一个手势音量控制功能,代码用到了前面手部跟踪封装的HandDetector.这篇文章在这里: Python Opencv实践 - 手部跟踪-CSDN博客文章浏览阅读626次,点赞11次,收藏7次。使用mediapipe库做手部的实时跟踪&…...
关于Selenium的网页对象单元测试的设计模式
写在前面:经过了实践总结一下经验,心得进行一个分享。 首先driver是可以单独抽出来的,变成一个driver函数放在driver.py。 from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver…...

基于多反应堆的高并发服务器【C/C++/Reactor】(上)
(一)初始化服务器端用于监听的套接字 Server.h #pragma once // 初始化监听的套接字 int initListenFd(unsigned short port); Server.c int initListenFd(unsigned short port) {// 1.创建监听的fdint lfd socket(AF_INET, SOCK_STREAM, 0);if(lf…...

腾讯云debian服务器的连接与初始化
目录 1. 远程连接2. 软件下载3. 设置开机自启动 1. 远程连接 腾讯云给的服务器在安装好系统之后,只需要在防火墙里面添加一个白名单(ip 或者域名)就能访问了。 浏览器打开https://www.ipip.net/,在左下角找到自己所用的WIFI的公…...

医保购药小程序:智能合约引领医疗数字革新
在医疗领域,医保购药小程序通过引入智能合约技术,为用户提供更为高效、安全的购药体验。本文将通过简单的智能合约代码示例,深入探讨医保购药小程序如何利用区块链技术中的智能合约,实现医保结算、购药监控等功能,为医…...

神经网络:深度学习优化方法
1.有哪些方法能提升CNN模型的泛化能力 采集更多数据:数据决定算法的上限。 优化数据分布:数据类别均衡。 选用合适的目标函数。 设计合适的网络结构。 数据增强。 权值正则化。 使用合适的优化器等。 2.BN层面试高频问题大汇总 BN层解决了什么问…...

Unity中Shader旋转矩阵(二维旋转矩阵)
文章目录 前言一、旋转矩阵的原理1、我们以原点为中心,旋转坐标轴θ度2、求 P~2x~:3、求P~2y~:4、最后得到 P~2~点 的点阵5、该点阵可以拆分为以下两个矩阵相乘的结果 二、在Shader中,使用该旋转矩阵实现围绕 z 轴旋转1、在属性面板定义 floa…...
零门槛NAS搭建:WinNAS如何让普通电脑秒变私有云?
一、核心优势:专为Windows用户设计的极简NAS WinNAS由深圳耘想存储科技开发,是一款收费低廉但功能全面的Windows NAS工具,主打“无学习成本部署” 。与其他NAS软件相比,其优势在于: 无需硬件改造:将任意W…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...
线程与协程
1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指:像函数调用/返回一样轻量地完成任务切换。 举例说明: 当你在程序中写一个函数调用: funcA() 然后 funcA 执行完后返回&…...

[10-3]软件I2C读写MPU6050 江协科技学习笔记(16个知识点)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16...

Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...

自然语言处理——Transformer
自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效,它能挖掘数据中的时序信息以及语义信息,但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN,但是…...

如何理解 IP 数据报中的 TTL?
目录 前言理解 前言 面试灵魂一问:说说对 IP 数据报中 TTL 的理解?我们都知道,IP 数据报由首部和数据两部分组成,首部又分为两部分:固定部分和可变部分,共占 20 字节,而即将讨论的 TTL 就位于首…...

R语言速释制剂QBD解决方案之三
本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...