2.2. 从您自己的镜像创建自定义镜像


您可以构建自己的自定义镜像。但是,您必须确保您的镜像与 OpenShift 和 OpenShift AI 兼容。

2.2.1. 创建您自己的工作台镜像的基本指南

以下基本指南提供了在构建自己的自定义工作台镜像时需要考虑的信息。

设计您的镜像以使用 USER 1001 运行

在 OpenShift 中,容器将使用随机 UID 和 GID 0 运行。确保您的镜像与这些用户和组要求兼容,特别是在您需要写入目录时。最佳实践是设计您的镜像,以使用 USER 1001 运行。

避免将工件放在 $HOME 中

附加到工作台的持久性卷将挂载到 /opt/app-root/src 上。此位置也是 $HOME 的位置。因此,不要将任何文件或其他资源放在 $HOME 中,因为它们不会在部署工作台(并挂载持久性卷)后可见。

指定 API 端点

OpenShift 就绪度和存活度探测将查询 /api 端点。对于 Jupyter IDE,这是默认端点。对于其他 IDE,您必须实现 /api 端点。

2.2.2. 创建您自己的工作台镜像的高级指南

以下指南提供了在构建自己的自定义工作台镜像时需要考虑的信息。

最小化镜像大小

工作台镜像使用"层化"文件系统。每次您在工作台镜像文件中使用 COPY 或 RUN 命令时,都会创建一个新层。工件不会被删除。当您删除工件时,例如,文件在下一个层中"掩码"。因此,在创建工作台镜像文件时请考虑以下准则。

  • 避免使用 dnf update 命令。

    • 如果您从持续更新的镜像(如 Red Hat Catalog 中的 ubi9/python-39 )开始,您可能不需要使用 dnf update 命令。这个命令获取新的元数据,更新可能不会影响的文件,并增加工作台镜像的大小。
    • 指向基础镜像的较新版本,而不是对旧版本执行 dnf 更新
  • RUN 命令.通过在每行末尾添加 && \ 来串联您的命令。
  • 如果需要编译代码(如库或应用程序)才能包含在自定义镜像中,实施多阶段构建,以避免在最终镜像中包含构建工件。也就是说,在中间镜像中编译库或应用程序,然后将结果复制到最终镜像,留下了您不想包含的工件。

设置文件和目录的访问权限

  • 将文件和文件夹的所有权设置为 1001:0 (user "default", group "0"),例如:

    COPY --chown=1001:0 os-packages.txt ./
    Copy to Clipboard Toggle word wrap

    在 OpenShift 上,每个容器都位于标准命名空间中(除非您修改安全性)。容器使用具有随机用户 ID (uid)且组 ID (gid)的用户运行,组 ID 为 0。因此,您要写入的所有文件夹以及镜像中的所有文件都必须被具有随机用户 ID (uid)的用户访问。另外,您可以设置对任何用户的访问,如下例所示:

    COPY --chmod=775 os-packages.txt ./
    Copy to Clipboard Toggle word wrap
  • 使用 /opt/app-root/src 构建镜像,作为您要保留的数据的默认位置,例如:

    WORKDIR /opt/app-root/src
    Copy to Clipboard Toggle word wrap

    当用户从 OpenShift AI Applications Enabled 页面启动工作台时,用户的"personal"卷被挂载到 /opt/app-root/src。由于此位置不可配置,因此在构建自定义镜像时,您必须为持久性数据指定此默认位置。

  • 修复相应的权限,以在 OpenShift 环境中支持 PIP (Python 软件包的软件包管理器)。在您的自定义镜像中添加以下命令(如果需要,将 python3.9 更改为您使用的 Python 版本):

    chmod -R g+w /opt/app-root/lib/python3.9/site-packages && \
       fix-permissions /opt/app-root -P
    Copy to Clipboard Toggle word wrap
  • 您的工作台镜像中的服务必须在 ${NB_PREFIX}/api 上回答,否则 OpenShift 存活度/就绪探测将失败,并删除工作台镜像的 pod。

    NB_PREFIX 环境变量指定容器要侦听的 URL 路径。

    以下是 Nginx 配置示例:

    location = ${NB_PREFIX}/api {
    	return 302  /healthz;
    	access_log  off;
    }
    Copy to Clipboard Toggle word wrap
  • 要使空闲剔除正常工作,${NB_PREFIX}/api/kernels URL 必须返回专门格式化的 JSON 有效负载,如下例所示:

    以下是 Nginx 配置示例:

    location = ${NB_PREFIX}/api/kernels {
    	return 302 $custom_scheme://$http_host/api/kernels/;
    	access_log  off;
    }
    
    location ${NB_PREFIX}/api/kernels/ {
    	return 302 $custom_scheme://$http_host/api/kernels/;
    	access_log  off;
    }
    
    location /api/kernels/ {
      index access.cgi;
      fastcgi_index access.cgi;
      gzip  off;
      access_log	off;
     }
    Copy to Clipboard Toggle word wrap

    返回的 JSON 有效负载应该是:

    {"id":"rstudio","name":"rstudio","last_activity":(time in ISO8601 format),"execution_state":"busy","connections": 1}
    Copy to Clipboard Toggle word wrap

启用 CodeReady Builder (CRB)和 Extra Packages for Enterprise Linux (EPEL)

CRB 和 EPEL 是提供标准 Red Hat Enterprise Linux (RHEL)或通用基础镜像(UBI)安装中没有的软件包的软件仓库。它们对安装某些软件很有用,如 RStudio。

在 UBI9 镜像上,CRB 默认启用。要在基于 UBI9- 的镜像上启用 EPEL,请运行以下命令:

 RUN yum install -y https://download.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
Copy to Clipboard Toggle word wrap

要在基于 Centos Stream 9 的镜像上启用 CRB 和 EPEL,请运行以下命令:

 RUN yum install -y yum-utils && \
    yum-config-manager --enable crb && \
    yum install -y https://download.fedoraproject.org/pub/epel/epel-release-latest-9.noarch.rpm
Copy to Clipboard Toggle word wrap

添加 Elyra 兼容性

Red Hat OpenShift AI 版本 2.9 及更新的版本支持数据科学项目 V2 (由 odh-elyra 软件包提供)。以前的 OpenShift AI 版本支持数据科学管道 V1 (由 elyra 软件包提供)。

如果您希望自定义镜像支持数据科学管道 V2,您必须满足以下要求:

  • 包含 odh- elyra 软件包,以便与 Data Science 管道 V2 (而不是 elyra 软件包)提供支持,例如:

     USER 1001
    
     RUN pip install odh-elyra
    Copy to Clipboard Toggle word wrap
  • 如果要自动包含数据科学管道配置,作为运行时配置,请在导入自定义工作台镜像时添加注解。
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat