调整 Dockerfile 构建适用于 Task 的自定义镜像
目录
功能简介
在 Tekton 中,为了增强安全性,Task 可能会配置 runAsNonRoot: true
,这要求容器必须以非 root 用户运行。因此,在构建自定义镜像时,需要特别注意 Dockerfile 的配置,以确保镜像能够在这类 Task 中正常运行。
本文介绍如何调整 Dockerfile 来构建适用于 Task 的自定义镜像,重点关注用户权限的配置。
使用场景
以下场景需要参考本文的操作指导:
- 构建自定义镜像并在 Task 中使用
- 现有镜像在 Task 中运行时出现权限相关错误
- 确保镜像符合 Task 的安全要求
前置条件
使用本功能前,需确保:
- 具备 Docker 镜像构建环境
- 可以使用平台本身的构建流水线
- 如需使用社区/开源工具,需确保能访问外网或已准备好离线包
- 了解基本的 Dockerfile 编写知识
- 一个 Dockerfile 文件及相关配置
操作步骤
1. 确认基础镜像
首先需要确认基础镜像的发行版本,不同发行版本创建用户的命令可能不同:
# 查看基础镜像的发行版本
$ docker run -it --rm ${registry} cat /etc/os-release
# 可能的输出示例
NAME="Alpine Linux"
# 或
NAME="Debian GNU/Linux"
# 或
NAME="Ubuntu"
# 或
NAME="CentOS Linux"
2. 添加非 root 用户
在 Dockerfile 中添加非 root 用户(建议使用 UID 65532):
# 根据基础镜像选择对应的命令
# Alpine
RUN adduser -u 65532 -h /home/nonroot -D nonroot
# Debian
RUN adduser --home /home/nonroot --uid 65532 nonroot --disabled-password --gecos ""
# Ubuntu
RUN apt-get update && apt-get install -y adduser \
&& adduser --home /home/nonroot --uid 65532 nonroot --disabled-password --gecos ""
# CentOS
RUN groupadd -g 65532 nonroot && useradd -u 65532 -U -d /home/nonroot -m nonroot
3. 为该用户添加必要的权限(可选)
如果需要使用该用户访问某些目录或文件,需要为该用户添加必要的权限。
# 将目录或文件的拥有者设置为 nonroot
RUN chown -R nonroot:nonroot /path/to/directory
# 或者将目录或文件的权限设置为 所有人可读写 或其他最小权限
RUN chmod -R a+rwx /path/to/directory
4. 设置默认用户
在 Dockerfile 中设置默认用户(使用 UID 而不是用户名):
因为 Pods 配置了 runAsNonRoot
时,会检查用户 ID 是否为非 root 用户,而不是检查用户名。
# 设置默认用户为 nonroot(使用 UID)
USER 65532
5. 验证镜像
构建完成后,验证镜像是否可以正常运行:
# 验证用户配置
$ docker run -it --rm ${registry} id
# 预期输出
uid=65532(nonroot) gid=65532(nonroot) groups=65532(nonroot)
# 验证应用程序权限
$ docker run -it --rm ${registry} ls -la /home/nonroot
操作结果
这样配置后:
-
用户配置
- 统一使用 UID 65532,便于多个 Task 中生成的文件具有一致的访问权限
- 确保用户有适当的工作目录权限
- 避免使用 root 用户或 UID 0
-
应用程序配置
- 确保应用程序能够以非 root 用户正常运行
- 在 Dockerfile 中提前配置好必要的目录权限
- 使用
VOLUME
指令定义需要持久化的目录
-
安全建议
- 定期更新基础镜像以修复安全漏洞
- 使用多阶段构建减小镜像体积
- 遵循最小权限原则配置用户权限
故障排查
如果镜像在 Task 中运行时遇到权限问题,可以:
- 检查 Pod 事件中的错误信息
- 验证镜像中的用户配置是否正确
- 确认应用程序所需的权限是否已配置
了解更多