当前位置: 首页 > news >正文

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 映像

相关文章:

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…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言:多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...

生成xcframework

打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...

css实现圆环展示百分比,根据值动态展示所占比例

代码如下 <view class""><view class"circle-chart"><view v-if"!!num" class"pie-item" :style"{background: conic-gradient(var(--one-color) 0%,#E9E6F1 ${num}%),}"></view><view v-else …...

循环冗余码校验CRC码 算法步骤+详细实例计算

通信过程&#xff1a;&#xff08;白话解释&#xff09; 我们将原始待发送的消息称为 M M M&#xff0c;依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)&#xff08;意思就是 G &#xff08; x ) G&#xff08;x) G&#xff08;x) 是已知的&#xff09;&#xff0…...

【RockeMQ】第2节|RocketMQ快速实战以及核⼼概念详解(二)

升级Dledger高可用集群 一、主从架构的不足与Dledger的定位 主从架构缺陷 数据备份依赖Slave节点&#xff0c;但无自动故障转移能力&#xff0c;Master宕机后需人工切换&#xff0c;期间消息可能无法读取。Slave仅存储数据&#xff0c;无法主动升级为Master响应请求&#xff…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容

目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法&#xff0c;当前调用一个医疗行业的AI识别算法后返回…...

Pinocchio 库详解及其在足式机器人上的应用

Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库&#xff0c;专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性&#xff0c;并提供了一个通用的框架&…...

Java毕业设计:WML信息查询与后端信息发布系统开发

JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发&#xff0c;实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构&#xff0c;服务器端使用Java Servlet处理请求&#xff0c;数据库采用MySQL存储信息&#xff0…...