总结之Docker(四)——镜像修改非ROOT用户权限后生成新镜像并发布

Docker拉去目标镜像

docker pull redis:6.2.5
如果出现拉去过程超时,或者连接失败。

添加镜像加速器,以阿里云为例,阿里云目前推广提供镜像加速器,需要登录。
https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors
生成的加速器地址,后面有教学如果使用加速器。

以windows为例

在Docker daemon加入(每个人地址不一样)

"registry-mirrors": [
    "https://jhtiz.mirror.aliyuncs.com"
  ]

在这里插入图片描述

创建Dockerfile

先在本地创建Dockerfile文件
编辑Dockerfile文件

FROM  redis:6.2.5

USER root

RUN groupadd -g 1001 bigdata && useradd -m -u 1001 -g bigdata  bigdata

RUN  chown -R 1001:1001  /opt/* && chown -R 1001:1001 /tmp /mnt

USER 1001

生成新镜像

docker build -t my-redis:0.0.1  d:/mydockerfiles

记得修改目录权限时,不能照抄,如下:
在这里插入图片描述
这里没有 /opt/* 文件或目录

这里要根据具体镜像内容和文件权限来

运行新镜像

查看镜像

docker images

运行新镜像id
-i: 交互式操作。
-t: 终端。

docker run -it 5a6ec30c0ef4

或者

docker run -d 5a6ec30c0ef4
出现无权限
应用生成日志没有权限 permission denied

或者

Unable to create directory required for Rundeck repository. Please ensure the file: /home/rund/repository exists and that Rundeck has write access to the directory. 

需要在Dockerfile中先调整目录权限、先创建目录

...
RUN groupadd -g 1001 bigdata && useradd -m -u 1001 -g bigdata bigdata && 
#创建目录
RUN mkdir -p /home/rund/repository
# 在切换用户之前调整日志目录权限
RUN mkdir -p /app/logs && chown -R bigdata:bigdata /app/logs

...

# 切换到非root用户
USER 1001

如果您希望更通用地解决权限问题,确保用户1001(或任何指定用户)对容器内所有需要访问的目录和文件都有适当的权限,可以采取以下策略:

使用通配符:
如果有多个目录或文件需要赋予权限,可以使用通配符来匹配一系列路径。例如,如果您需要对所有位于/home/rund/下的目录和文件进行权限设置,可以这样做:

Dockerfile

RUN chown -R 1001:1001 /home/rund/*

注意,这种方式不会递归地处理新创建的目录或文件。如果需要递归处理,您可能需要明确列出每个主要目录。

递归赋权:
对于需要递归处理的目录,确保使用-R标志。如果您知道容器启动过程中可能会动态创建某些目录或文件,可以预见到这些位置,并提前设置好权限。例如,如果除了/home/rundeck/外,还有其他几个目录需要赋权,可以逐一处理:

Dockerfile

RUN chown -R 1001:1001 /home/rund \
    && chown -R 1001:1001 /var/log/myapp \
    && chown -R 1001:1001 /etc/myapp/conf.d

创建和赋权结合:
如之前提到的,在创建目录的同时进行权限设置,确保新创建的目录直接归指定用户所有:

Dockerfile

RUN mkdir -p /path/to/new/dir && chown -R 1001:1001 /path/to/new/dir

使用setgid位:
对于某些需要用户组内成员共同协作的目录,可以设置setgid位,这样任何用户在该目录下创建的文件都会继承该目录的组所有权。这可以通过chmod g+s实现:

Dockerfile

RUN chmod -R g+s /home/rund/shared

使用临时的root命令执行脚本:
如果有复杂的权限设置逻辑,可以编写一个脚本,该脚本执行所有的权限设置逻辑,然后在Dockerfile中使用USER root执行这个脚本,最后再切换回非root用户。这样可以保持Dockerfile的清晰度和可维护性。

记住,虽然赋予非root用户足够的权限很重要,但也应当遵循最小权限原则,只给予执行任务所需的最小权限,以增强容器的安全性。

把新镜像推送到阿里云

先登录

docker login --username=153351 registry.cn-hangzhou.aliyuncs.com

推送

docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/imaniy/bigdata:[镜像版本号]

 docker push registry.cn-hangzhou.aliyuncs.com/imaniy/bigdata:[镜像版本号]

在这里插入图片描述

相关推荐

  1. 根据自己修改的容器制作镜像上传docker hub

    2024-06-18 03:10:02       33 阅读
  2. 修改docker镜像IP

    2024-06-18 03:10:02       39 阅读
  3. docker 修改镜像文件

    2024-06-18 03:10:02       14 阅读
  4. docker 修改镜像存储路径

    2024-06-18 03:10:02       29 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-06-18 03:10:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-18 03:10:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-18 03:10:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-18 03:10:02       18 阅读

热门阅读

  1. 国际化项目开发中关于时间的问题二

    2024-06-18 03:10:02       6 阅读
  2. Linux知识汇总

    2024-06-18 03:10:02       5 阅读
  3. Flink集群运行模式

    2024-06-18 03:10:02       7 阅读
  4. 617作业

    617作业

    2024-06-18 03:10:02      7 阅读
  5. k8s_DaemonSet和Deployment区别

    2024-06-18 03:10:02       9 阅读
  6. 细说MCU定时器中断的实现方法

    2024-06-18 03:10:02       7 阅读
  7. webpack之HMR

    2024-06-18 03:10:02       6 阅读
  8. kali - 配置静态网络地址 + ssh 远程连接

    2024-06-18 03:10:02       5 阅读
  9. 【Prometheus】自动化效率脚本

    2024-06-18 03:10:02       6 阅读