“我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第9篇文章,点击查看活动详情”
问题背景
1、问题描述:
这里有个前提条件就是:FROM 的基础镜像更改了 USER ,但是我不知道,还以为是 root 用户
- 场景一:Dockerfile 中使用 apt-get update,然后构建镜像
- 场景二:在 docker 容器中执行:apt-get update
报错:E: List directory /var/lib/apt/lists/partial is missing. - Acquire (13: Permission denied),意思就是说权限不足。
2、问题原因:权限不足,请使用 root 用户
3、解决方案:0 表示 root 用户
docker exec -it id /bin/bash
# 应该改为
docker exec -u 0 -it id /bin/bash
上述是针对场景二的解决,下面我们来分析下针对场景一该如何解决。
Dockerfile 具体原因及如何解决
使用 Dockerfile 构建一个镜像,如果使用的 基础镜像 设置了 USER 项,则之后的所有构建动作都切换到了 USER 指定的用户,且 docker run 该镜像后的用户也是 USER 指定的用户。
那么我遇到的这个问题就是因为我的 Dockerfile FROM 的基础镜像是 openGauss 的一个镜像,其基础镜像使用的是其自定义用户 USER omm,因为 apt 安装需要 root 权限用户,所以就会报权限不足的问题。
因此为了能在 Base Image 基础镜像上继续添加构建动作,则可以使用 USER root 切换到 root 用户执行构建,再在构建结束时使用 USER someone 切换为原用户。
比如我在 RUN apt update 之前使用 USER root 切换到 root 用户执行构建即可。即如下这样结构:
FROM Some Base Image
# ... 其他业务
USER root
# ... 其他业务
USER someone
# ... 其他业务
那么针对我遇到的这个问题如何解决呢?我在使用 opengauss 镜像的时候,因为镜像启动 opengauss 的时候需要使用 omm 账户,但是我在镜像之前需要使用 apt 去安装 ssh,之后还需要通过 root 账户去启动 ssh。所以整体用户流程就是这样:
# FROM ENV 等其他 Dockerfile 内容
USER root # 切换为 root 用户环境
# 这里可以使用 apt 去下载或一些其他操作
# ...
USER omm # 切换为 opengauss 用户环境 omm
CMD ['opengauss'] # 这里得用 omm 账户去启动 opengauss
USER root # 启动完之后得再切回 root,以便后续去开启 ssh 服务
Dockerfile USER 的作用
最后我们再回过来看 Dockerfile 里 USER 的作用,我想就会有新的认识了。
PS:针对上面介绍的这种基础镜像更换了 USER 的,我们容易踩坑哦。
USER daemom:指定运行容器时的用户名或 UID
USER 是用来切换运行属主身份的。docker 默认是使用 root 用户,但若不需要,建议切换使用者身份,毕竟 root 权限太大了,使用上有安全的风险。