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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java8新特性 Stream

首先创建一个用户的实体类,包括姓名、年龄、性别、地址、赏金 几个属性 Data public class User {//姓名private String name;//年龄private Integer age;//性别private Integer sex;//地址private String address;//赏金private BigDecimal money;public User(St…

2023一整年BurpSuit都更新了什么?

2023一整年BurpSuit都更新了什么? 2023.5之前除了引入了montoya的外,其他基本都属于优化,不统计了。 历史版本地址:https://portswigger.net/burp/releases/archive?y2023 2023.5 Organizer Notes Live crawl paths view 2023.6 …

如何使用Docker搭建青龙面板并结合内网穿透工具发布至公网可访问

文章目录 一、前期准备本教程环境为:Centos7,可以跑Docker的系统都可以使用。本教程使用Docker部署青龙,如何安装Docker详见: 二、安装青龙面板三、映射本地部署的青龙面板至公网四、使用固定公网地址访问本地部署的青龙面板 正文…

ansible变量的使用

本章主要介绍playbook中的变量 自定义变量使用变量文件字典变量列表变量facts变量内置变量变量的过滤器 为了能够写出更实用的playbook,需要在playbook中使用变量。下面来讲解playbook 中常见的变量。本章实验都在/home/lduan/demo2下操作,先把 demo2目…

【高录用快检索】第四届机械设计与仿真国际学术会议(MDS 2024)

【高录用快检索】第四届机械设计与仿真国际学术会议(MDS 2024) 2024 4th International Conference on Mechanical Design and Simulation 2024年第四届机械设计与仿真国际学术会议(MDS 2024) 将于2024年03月01-03日在中国西安召开。MDS 2024将围绕“…

一篇文章带你了解SpringBoot目录结构

前言 SpringBoot是整合Spring技术栈的一站式框架,是简化Spring技术栈的快速开发脚手架,是一个能够快速构建生产级别的Spring应用的工具。SpringBoot是目前流行的微服务框架,倡导“约定优于配置”,简化Spring项目搭建及开发过程。…

Ubuntu配置GPU资源

0、升级内核为5.15.0-88-generic: 0.1 配置下载源: 在/etc/apt/sources.list.d目录下新建list文件,添加内容: deb http://mirrors.aliyun.com/ubuntu/ focal-updates amin restricted0.2 下载 sudo apt-get install linux-imag…

中小型教育网络安全解决方案

热门IT技术视频教程:https://xmws-it.blog.csdn.net/article/details/134398330?spm1001.2014.3001.5502 一、中小型教育网络的安全现状及挑战 当前,校园网的安全形势非常严峻,大量的垃圾邮件、黑客攻击、病毒蠕虫等困扰着管理者。而且这些作…

java使用面向对象实现图书管理系统

꒰˃͈꒵˂͈꒱ write in front ꒰˃͈꒵˂͈꒱ ʕ̯•͡˔•̯᷅ʔ大家好,我是xiaoxie.希望你看完之后,有不足之处请多多谅解,让我们一起共同进步૮₍❀ᴗ͈ . ᴗ͈ აxiaoxieʕ̯•͡˔•̯᷅ʔ—CSDN博客 本文由xiaoxieʕ̯•͡˔•̯᷅ʔ 原创 CSDN …

2023年12月21日历史上的今天大事件早读

1375年12月21日 意大利文艺复兴的代表人物薄伽丘逝世 1620年12月21日 英国抵达第一个北美殖民地普利茅斯 1879年12月21日 斯大林出生 1921年12月21日 苏俄电气化计划批准 1928年12月21日 天津劝业场开业 1928年12月21日 中国核化学家王方定出生 1935年12月21日 载客21人的…

飞书+ChatGPT搭建智能AI助手,无公网ip实现公网访问飞书聊天界面

飞书ChatGPT搭建智能AI助手,无公网ip实现公网访问飞书聊天界面 前言环境列表1.飞书设置2.克隆feishu-chatgpt项目3.配置config.yaml文件4.运行feishu-chatgpt项目5.安装cpolar内网穿透6.固定公网地址7.机器人权限配置8.创建版本9.创建测试企业10. 机器人测试 前言 …

qt-C++笔记之app.processEvents()和QApplication::processEvents()的区别

qt-C笔记之app.processEvents()和QApplication::processEvents()的区别 code review! 代码1: QApplication app(argc, argv); app.processEvents(); 代码2: QApplication::processEvents(); 区别 代码1和代码2的区别在于代码1中使用了一个具体的QApplication对…

Java项目的学习记录---12306购票系统的技术架构选型

后端技术架构 选择基于 Spring Boot 3 和 JDK17 进行底层建设 前端技术架构

征集倒计时 | 2023年卓越影响力榜单-第四届中国产业创新奖报名即将截止

第四届「ISIG中国产业智能大会」将于2024年3月16日在上海举办。2024 ISIG 以“与科技共赢,与产业共进”为主题,共设立RPA超自动化、 低代码、AIGC大模型、流程挖掘四大主题峰会。届时,大会组委会将颁发2023年度卓越影响力榜单—第四届中国产业…

动态内存分配(malloc和free​、calloc和realloc​)

目录 一、为什么要有动态内存分配​ 二、C/C中程序内存区域划分​ 三、malloc和free​ 2.1、malloc 2.2、free​ 四、calloc和realloc​ 3.1、calloc​ 3.2、realloc​ 3.3realloc在调整内存空间的是存在两种情况: 3.4realloc有malloc的功能 五、常见的动…

vue proxy代理 和 Nginx 配置跨域

vue.config.js文件中配置的代理: devServer: {port: 9095,// open: true, // 配置项目在启动时自动在浏览器打开proxy: {/yh: { // /api是代理标识,一般是每个接口前的相同部分target: "http://192.168.5.58:8002", // 请求地址,一…

Python3 标准库中推荐的命令行解析模块argparse的使用示例

import os import argparse import sys import requests import json import subprocess from datetime import datetime# 定义一个装饰器,在方法执行异常时跳过执行 def skip_on_exception(func):def wrapper(*args, **kwargs):try:return func(*args, **kwargs)ex…

uniapp uview 页面多个select组件回显处理,默认选中

<view class"add-item column space-around" click"selectClick(1)"><text class"w-s-color-3 f-28">商品分类</text><view class"w-100 space-between"><!-- 第一个参数为你的单选数组&#xff0c;第二个…

黑马头条--day07--app文章搜索

目录 一.安装elasticsearch 1.拉取镜像 2.创建存放数据及配置文件的文件夹&#xff0c;启动时挂载。 4.修改文件夹权限 5.启动容器 5.1参数解释 6.安装ik分词器 6.2测试一下Ik分词器 二.添加文章索引库 1查询所有的文章信息&#xff0c;批量导入到es索引库中 2)测试 …

自我学习--关于如何设计光耦电路

本人在项目中多次设计光耦电路&#xff0c;目前电路在项目中运行比较平稳&#xff0c;所以总结一下自己的设计经验&#xff0c;与大家交流一下&#xff0c;如有错误还希望大家指出改正&#xff0c;谢谢&#xff08;V&#xff1a;Smt15921588263&#xff1b;愿与大家多交流&…