自定义容器映像

通过 预配置的基础映像 由 Cloud Workstations 提供的极简环境,包含 IDE、 基本 Linux 终端和语言工具,以及 sshd 服务器。为了加快 环境设置,则可以创建自定义 这些容器映像扩展为预安装工具和 依赖项以及运行自动化脚本

对于自定义容器映像,我们建议设置一个流水线 在 Cloud Workstations 基础映像更新后,重新构建这些映像, 除了运行容器扫描工具 Artifact Analysis 可 并检查您添加的所有其他依赖项您将对 维护和更新添加到自定义映像的自定义软件包和依赖项。

准备工作

  1. 您需要一台具有用于构建容器映像的工具的机器, 以及将映像推送到 Artifact Registry 或 Container Registry Google Cloud CLI。 您可以使用 Cloud Workstations 或 Cloud Shell Editor 这些步骤中预安装了此工具。

  2. 从我们的 受支持的基础映像列表, 例如 us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest

    或者,您可以使用自己的容器映像,或使用外部 安装容器映像 使用您自己的容器映像

  3. 创建一个文件夹,如 CUSTOM_IMAGE_FOLDER 和一个 Dockerfile 所在的文件夹,用于扩展所选基础映像,如 下面举例说明。

Cloud Workstations 基础映像结构

Cloud Workstations 基础映像采用以下定义的结构:

  • 基础映像入口点文件设置为 /google/scripts/entrypoint.sh
  • 启动时,基础映像会在以下位置运行 /etc/workstation-startup.d/* 下的文件: 按字典顺序初始化工作站环境。

    这些文件及其行为如下:

    • 000_configure-docker.sh:在 工作站。
    • 010_add-user.sh:在 Cloud Workstations 中创建默认用户。

      由于永久性磁盘是动态挂接到容器 必须在工作站启动时添加用户,而不是在 Dockerfile 中添加。

    • 020_start-sshd.sh:启动容器中的 sshd 服务。

    • 110_start-$IDE.sh:启动映像的 IDE。

  • Cloud Workstations 将 Docker 映像存储在以下位置的主目录中: /home/.docker_data,以便在会话之间保留图片。

如需在工作站启动期间添加其他功能,请将脚本添加到 /etc/workstation-startup.d/ 目录:

  • 此目录中的脚本默认以根用户身份运行。要将脚本作为 如果是其他用户,请使用 runuser 命令。

  • 由于脚本按字典顺序执行,因此我们建议您 为脚本添加一个大于 200 的三位数数字作为前缀。

主目录修改

当工作站配置指定了永久性主目录时 (这是默认行为),一个支持主目录的永久性磁盘 会在运行时动态附加到容器此过程会覆盖 在容器映像构建时对 /home 目录所做的修改。

如需保留更新,请在容器运行时修改 /home 目录 方法是在 /etc/workstation-startup.d 目录中的 下添加一个脚本, 或在 /etc/profile.d 目录中添加每位用户的配置。 为了加快此过程,请考虑将设置脚本作为后台运行 过程(在命令末尾添加和号 &),以避免 启动容器

一些应移动到容器的构建时配置示例 运行时:

  • 每位用户的 git 配置
  • 已克隆到主目录中的 git 个代码库
  • 直接用户配置,例如将文件放在 $HOME/.config 目录中
  • 创建用户

用户创建和修改

由于永久性磁盘在运行时动态挂接到容器 必须在工作站启动时添加用户,而不是在 Dockerfile 中添加。修改 或创建其他用户,我们建议您更新 /etc/workstation-startup.d/010_add-user.sh,或者 创建您自己的在启动时执行的脚本。

此外,您可以通过更新方法,为用户修改默认的 bash 配置文件 /etc/profile.d 中的文件。

更新预配置的安全 APT 密钥

Cloud Workstations 基础映像预装了多种工具, 使用安全 APT 从各种第三方存储库获取数据。在安装过程中 过程,系统会使用 gpg 导入代码库所有者提供的公钥 并放入 /usr/share/keyrings/ 下的单个文件中。这些文件是 引用自 /etc/apt/sources.list.d/ 下的相应 list 文件。 这样一来,apt 便可在以下情况下验证给定代码库的完整性: 交互方式。

第三方代码库所有者有时可能决定更改公钥 用于验证其代码库的完整性,这会导致 apt 在与它互动时显示错误。要解决这一潜在问题 您可以使用 /google/scripts/refresh-preinstalled-apt-keys.sh, 获取预安装公钥的最新版本并重新导入它们。

列出已安装的 IDE 版本

多个 Cloud Workstations 基础映像预安装了一个 IDE。对于 请参阅随附的 /google/scripts/preinstalled-ide-versions.sh 脚本,其中列出了 IDE 中安装的 IDE 的名称和版本信息 图片。

停用 sudo 项 root 权限

默认工作站用户在以下文件夹中拥有 sudo 项 root 访问权限 容器要关闭对 Docker 容器的 root 访问权限,请设置 CLOUD_WORKSTATIONS_CONFIG_DISABLE_SUDO 环境变量 设置为 true

要在创建容器时通过 Google Cloud 控制台设置此环境变量,请执行以下操作: 您的工作站配置,请按以下步骤操作:

  1. 创建工作站配置时,请完成配置 了解基本信息和机器配置。
  2. 环境自定义对话框中,展开 高级容器选项部分,然后选择环境变量
  3. 点击添加添加变量
  4. 输入 CLOUD_WORKSTATIONS_CONFIG_DISABLE_SUDOtrue 作为值。

使用您自己的容器映像

您还可以使用自己的容器映像或使用外部容器映像, 但前提是它们基于 Linux 并在容器运行时运行阻塞进程, 启动。

在设置 Dockerfile 时,ENTRYPOINT 指令必须运行一个 sleep infinity等阻塞进程 而不是立即退出或者,在工作站中 您可以设置 config.container.args 字段以指定 阻止进程

使用您自己的容器映像时,请注意以下事项:

  • Cloud Workstations 不需要来自 Cloud Workstations 基础映像。

    不过,您可以在 /etc/workstation-startup.d/ 中查看脚本, 目录来运行 Cloud Workstations 基础映像。 文件名表示每个脚本的用途。

  • 我们建议您在容器中运行 SSH 服务器。请参阅 默认设置为 /etc/workstation-startup.d/020_start-sshd.sh 基础映像 了解 Cloud Workstations 如何进行默认设置。

  • 我们建议您在端口 80 上运行默认 IDE 或 Web 服务器。

扩展 Cloud Workstations 基础映像

扩展 Cloud Workstations 基础映像以为您的虚拟机创建自定义映像时 工作站环境中,您可以采用以下三种方法:

  1. 更新 Dockerfile,在其中添加 。
  2. /etc/workstation-startup.d/ 下添加其他可执行文件,以 自定义运行中的容器此目录下的文件会自动 在容器启动时按字典顺序运行,因此您可以在 文件名,以便在工作站启动期间的适当时间运行该程序。
  3. 替换 Dockerfile 中的 ENTRYPOINT,以全面自定义您的 启动容器

自定义 Dockerfile 示例

本部分提供了示例场景并说明如何创建自己的 Dockerfile。

预安装了 emacs 的容器映像

如需创建预安装了 emacs 的容器映像,请运行以下命令 命令:

FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest

RUN sudo apt update
RUN sudo apt install -y emacs

具有用户自定义功能的容器映像

如需自定义容器映像,请按以下步骤操作:

  1. /etc/workstation-startup.d/* 中创建在以下日期之后运行的脚本: 010_add-user.sh - 例如 011_customize-user.sh

    #!/bin/bash
    # Create new group
    groupadd $GROUP
    # Add the user to a new group
    usermod -a -G $GROUP $USERNAME
    

    $GROUP 替换为新的群组名称,然后 将 $USERNAME 替换为用户的用户名。

  2. 假设您将脚本命名为 011_customize-user.sh,请将 将以下内容添加到 Dockerfile 中的映像,并使其可执行:

    FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest
    
    COPY 011_customize-user.sh /etc/workstation-startup.d/
    
    RUN chmod +x /etc/workstation-startup.d/011_customize-user.sh
    

在 SSH 会话中设置容器环境变量的容器映像

在工作站配置或工作站级别设置的环境变量 则会使用入口点命令传递给直接子进程。这包括 IDE 中的预配置基础映像。但是,SSH 会话不是子级 入口点,而且没有这些自定义环境 变量。

如需在 SSH 会话中设置这些环境变量,请设置 从容器的容器中继这些环境变量的容器映像 进入 /etc/environment 文件。

为此,请按以下步骤操作:

  1. /etc/workstation-startup.d/* 中创建在以下日期之后运行的脚本: 010_add-user.sh - 例如 011_add-ssh-env-variables.sh

    #!/bin/bash
    #
    echo "CUSTOM_ENV_VAR=$CUSTOM_ENV_VAR" >> /etc/environment
    

    CUSTOM_ENV_VAR 替换为预期的环境变量 名称。

  2. 假设您将脚本命名为 011_add-ssh-env-variables.sh,请将 将以下内容添加到 Dockerfile 中的映像,并使其可执行:

    FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest
    
    COPY 011_add-ssh-env-variables.sh /etc/workstation-startup.d/
    
    RUN chmod +x /etc/workstation-startup.d/011_add-ssh-env-variables.sh
    

为 SSH 会话启用 X11 转发的容器映像

X11 转发可让您启动远程应用并转发应用 本地计算机

如需创建启用 X11 转发的容器映像,请修改 OpenSSH 守护程序 Cloud Workstations 基础映像提供的配置文件 (/etc/ssh/sshd_config) 附加 X11Forwarding yes(以允许 X11 转发)和 AddressFamily inet (确保仅使用 IPv4)。如需了解有关这些关键字的详细信息,请参阅 OpenBSD Web 关于“AddressFamily”和 X11Forwarding

下面是一个 Dockerfile 示例,可以进行必要的修改:

FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest

# Permit X11 forwarding using only IPv4
RUN cat >> /etc/ssh/sshd_config <<-EOF

AddressFamily inet
X11Forwarding yes
EOF

将 Cloud Workstations 的代码 OSS 复制到其他容器映像

在多阶段构建中,您可以使用多个 FROM 语句 放在 Dockerfile 中每个 FROM 指令都可以使用不同的基数,并支持 在构建阶段之间复制工件。将 Code OSS for Cloud Workstations 添加到 另一个容器映像使用多阶段构建来复制应用文件夹 /opt/code-oss 添加到您的图片中。如果您想启动 Code OSS for Cloud Workstations 在容器启动时,再复制脚本 /etc/workstation-startup.d/110_start-code-oss.sh 复制到您的容器中

下面是一个示例 Dockerfile,它将 Code OSS 复制到 JetBrains IntelliJ 中 终极图片。然后,您可以与 IDE 进行交互:

FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest as code-oss-image

FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/jetbrains-intellij:latest

# Copy Code OSS for Cloud Workstations and startup scripts into our custom image
COPY --from=code-oss-image /opt/code-oss /opt/code-oss
COPY --from=code-oss-image /etc/workstation-startup.d/110_start-code-oss.sh /etc/workstation-startup.d/110_start-code-oss.sh

# Use the existing entrypoint script which will execute all scripts in /etc/workstation-startup.d/
ENTRYPOINT ["/google/scripts/entrypoint.sh"]

在 Code OSS for Cloud Workstations 进行 Java 开发的 Code OSS 中预安装 IDE 扩展程序的容器映像

要创建在以下位置预安装 IDE 扩展程序的容器映像: Code OSS for Cloud Workstations 进行 Java 开发时,请运行以下命令:

FROM us-central1-docker.pkg.dev/cloud-workstations-images/predefined/code-oss:latest

RUN wget https://open-vsx.org/api/vscjava/vscode-java-debug/0.40.1/file/vscjava.vscode-java-debug-0.40.1.vsix && \
unzip vscjava.vscode-java-debug-0.40.1.vsix "extension/*" &&\
mv extension /opt/code-oss/extensions/java-debug

RUN wget https://open-vsx.org/api/vscjava/vscode-java-dependency/0.19.1/file/vscjava.vscode-java-dependency-0.19.1.vsix && \
unzip vscjava.vscode-java-dependency-0.19.1.vsix "extension/*" &&\
mv extension /opt/code-oss/extensions/java-dependency

RUN wget https://open-vsx.org/api/redhat/java/1.6.0/file/redhat.java-1.6.0.vsix && \
unzip redhat.java-1.6.0.vsix "extension/*" &&\
mv extension /opt/code-oss/extensions/redhat-java

RUN wget https://open-vsx.org/api/vscjava/vscode-maven/0.35.2/file/vscjava.vscode-maven-0.35.2.vsix && \
unzip vscjava.vscode-maven-0.35.2.vsix "extension/*" &&\
mv extension /opt/code-oss/extensions/java-maven

RUN wget https://open-vsx.org/api/vscjava/vscode-java-test/0.35.0/file/vscjava.vscode-java-test-0.35.0.vsix && \
unzip vscjava.vscode-java-test-0.35.0.vsix "extension/*" &&\
mv extension /opt/code-oss/extensions/java-test

如果您预安装了扩展程序,它们就会被视为内置扩展程序。 您将无法更新这些附加信息,它们可能不会出现在 上的已安装部分 扩展程序市场。 不过,您可以搜索 @builtin

在启动时安装扩展程序的另一种方法是 启动脚本。 例如,在 /etc/workstation-startup.d/120_install_extensions.sh

/opt/code-oss/bin/codeoss-cloudworkstations --install-extension vscjava.vscode-java-debug@0.40.1 \
--install-extension vscjava.vscode-java-dependency@0.19.1  \
--install-extension redhat.java@1.6.0 \
--install-extension vscjava.vscode-maven@0.35.2 \
--install-extension vscjava.vscode-java-test@0.35.0

使用此方法时,扩展程序会显示在 扩展程序市场与您 以便进行更新

将 JetBrains IDE 和插件安装到基础映像中

为工作站配置自定义 Docker 映像时,您可以安装 JetBrains IDE 和插件,例如 Cloud Code for IntelliJ、 添加到基础映像中 JetBrains 产品的 Cloud Workstations 基础映像包括以下内容 脚本来帮助您:

  • jetbrains-installer.sh:安装 JetBrains IDE
  • plugin-installer.sh:安装插件,例如 Cloud Code for IntelliJ

根据需要使用这些脚本来自定义基础映像,以通过 启动脚本或在启动工作站后运行这些脚本。

安装程序脚本

如需查看 jetbrains-installer.sh 的源文件和 plugin-installer.sh 脚本,请使用工作站启动工作站 使用某个 JetBrains 预定义映像的配置,则连接到 创建工作站,然后通过 JetBrains Gateway 或 SSH 访问,然后浏览 installer-scripts 目录下的脚本文件,该目录位于 根目录下。

我们建议您在构建容器时运行这些脚本。避免跑步 部署到已启动的工作站中

使用插件安装程序脚本

plugin-installer.sh 脚本使用以下语法:

plugin-installer.sh [-v VERSION] [-d DESTINATION-DIRECTORY] [-c CHECKSUM] [-f] PLUGIN_ID

替换以下内容:

  • VERSION:要安装的插件的可选版本号。
  • DESTINATION-DIRECTORY:可选目录,用于存放插件 。如果未指定,系统会使用工作目录。
  • CHECKSUM:所请求插件的可选 SHA-256 校验和。
  • -f:如果指定,则将覆盖任何现有插件。
  • PLUGIN_ID:必需的数字插件标识符, JetBrains 市场。例如,要添加 Dart 使用 6351 作为 PLUGIN_ID。添加 Cloud Code for IntelliJ 使用 8079 作为 PLUGIN_ID。

例如,如需在 IntelliJ 中安装最新版本的 Dart 插件,请运行以下命令:

plugin-installer.sh -d /opt/ideaIU/plugins/ 6351

使用 JetBrains 安装程序脚本

在以下情况下,我们建议您使用 JetBrains 安装程序脚本 扩展预配置的基础映像

jetbrains-installer.sh 脚本使用以下语法:

jetbrains-installer.sh IDE [ pinned|latest ]

替换以下内容:

  • IDE:要安装的 JetBrains IDE。您必须使用一个 以下 IDE 缩写之一:

    IDE 产品已安装
    cl CLion
    clion CLion
    go GoLand
    goland GoLand
    iiu 《Intellij Ultimate》
    intellij 《Intellij Ultimate》
    pcp PyCharm Professional
    pycharm PyCharm Professional
    ps PHPStorm
    phpstorm PHPStorm
    rd Rider
    rider Rider
    rm RubyMine
    rubymine RubyMine
    ws WebStorm
    webstorm WebStorm
  • pinned|latest:可选 - 使用固定的或 最新版本的 IDE。默认值为 latest

例如,如需安装最新版本的 Clion,请运行以下命令: 命令:

jetbrains-installer.sh clion

自定义 JetBrains IDE 配置文件

如果在工作站中指定了永久性主目录 配置,搭配 JetBrains IDE 的 Cloud Workstations 基础映像 自动保留 $IDE.vmoptions$IDE.properties 配置 文件。要覆盖这些文件的默认位置,请指定 CLOUD_WORKSTATIONS_JETBRAINS_PERISTED_CONFIG_DIR 环境变量。

如需了解详情,请参阅 任何国家/地区中的/etc/workstation-startup.d/120_persist-jetbrains-configs.sh 用于学习的 JetBrains 基础映像 Cloud Workstations 如何进行这项默认配置。

使用 Cloud Code for IntelliJ 扩展基础 Docker 映像

以下 Dockerfile 代码段使用 将 8079 添加为必需的插件标识符,即可启用 Cloud Code for IntelliJ。 该示例还选择将 version 22.9.3-222 指定为版本 编号,/opt/ideaIU/plugins/ 作为目标目录,以及 89628279ed9042c526a81facc09bf53f8fb8b83b4595b0d329d94c1611e0c379作为 校验和:

...
# Install IDE and Plugins
RUN bash /installer-scripts/jetbrains-installer.sh intellij pinned && \
  # Install Cloud Code - https://plugins.jetbrains.com/plugin/8079-cloud-code
  bash /installer-scripts/plugin-installer.sh \
      -v 22.9.3-222 \
      -d /opt/ideaIU/plugins/ \
      -c 89628279ed9042c526a81facc09bf53f8fb8b83b4595b0d329d94c1611e0c379 \
      8079

# Register IDE with JetBrains Gateway
RUN echo 'runuser user -c "/opt/ideaIU/bin/remote-dev-server.sh registerBackendLocationForGateway"' > /etc/workstation-startup.d/110_register-intellij-with-gateway.sh \
    echo 'echo "IntelliJ-Ultimate ready for incoming gateway connection"' >> /etc/workstation-startup.d/110_register-intellij-with-gateway.sh
...

在 Code OSS for Cloud Workstations 中安装其他 IDE 扩展程序

如需更多 IDE 扩展程序,请访问 打开 VSX Registry。 您也可以通过复制.vsix文件的网址 任意扩展程序的下载链接。

打开 VSX 页面,找到显示“下载”按钮的 Go 语言扩展程序。

如果您打开 扩展程序市场 工作站,则会显示安装,而不是下载

Cloud Workstations 的默认代码 OSS 设置

如需详细了解在 Code OSS for Cloud Workstations 中存储设置的详细信息, 请参阅自定义设置

如果您在工作站配置中指定永久性主目录, 您可以通过添加 启动脚本 可将设置写入 $HOME/.codeoss-cloudworkstations/data/Machine/settings.json

例如,如果您要将默认颜色主题设置为“深色”,则可以扩展基础 以下脚本 /etc/workstation-startup.d/150_default-ide-color-theme.sh

cat <<< $(jq '. += {"workbench.colorTheme": "Default Dark Modern"}' settings.json) > settings.json

构建自定义容器映像

有关 Docker 命令的详细信息,请参阅 Docker 参考文档。 输入以下命令以构建容器:

docker build CUSTOM_IMAGE_FOLDER -t TARGET_IMAGE

请注意,替换 修改 修改图标会更新本页面上的其他示例。

替换以下内容:

  • CUSTOM_IMAGE_FOLDER:指向 用于存储自定义映像的文件夹中。
  • TARGET_IMAGE:指向 Artifact Registry 中映像的路径 (即 Container Registry)

    例如,TARGET_IMAGE 可能指向目标图片 类似于以下两个路径之一:

    *.pkg.dev/cloud-workstations-external/customimage:latest
    
    *.gcr.io/cloud-workstations-external/customimage:latest
    

    根据需要将 * 替换为区域名称,然后 任何其他标识符

您还可以更新 CLOUD_WORKSTATIONS_CUSTOM_IMAGE 环境变量 以指向代码库

如需详细了解如何在 Artifact Registry 中存储 Docker 映像,请参阅 以下部分:

托管您的自定义容器映像

如需托管自定义容器映像,我们推荐并支持 Artifact Registry。 如果您使用 GitHub 或任何其他公共或私有代码库,Cloud Workstations 可能无法按预期运行有关详情,请参见 使用自定义容器映像 部分。

测试自定义容器映像

容器构建完毕后,您可以使用以下代码对其进行测试 命令:

docker run --privileged -p LOCAL_PORT:CONTAINER_PORT TARGET_IMAGE

替换以下内容:

  • LOCAL_PORT:本地端口号
  • CONTAINER_PORT:容器端口号

例如,将 LOCAL_PORT:CONTAINER_PORT8080:80 将端口 8080 分配给本地使用,分配端口 80 用于以下用途 容器。

如果您要扩展 Cloud Workstations 基本编辑器映像,请运行 docker 命令,然后通过连接到工作站来测试工作站映像 通过本地浏览器连接,或运行 ssh 来连接到您的容器:

  • 如果您通过浏览器进行连接,请确保将 -p 8080:80 传递给 docker run命令 localhost:8080
  • 如果您希望通过 SSH 进行连接,请确保传递 -p 2222:22 添加到您的 docker run 命令,然后运行 ssh user@localhost -p 2222

使用自定义容器映像

如需在本地构建和测试自定义容器映像后使用该映像,请执行以下操作: 使用以下命令将容器推送到 Artifact Registry(或 Container Registry) 命令:

docker push TARGET_IMAGE

现在,您可以 创建工作站配置 刚刚创建并推送的容器映像

如需了解详情,请参阅 使用 Artifact Registry 创建 Docker 代码库

调试问题

如需查找和调试运行容器映像时遇到的问题,请查看 容器输出日志 运行 25 万个 Pod

您负责维护和更新自定义软件包, 依赖项

如果您要创建自定义映像,建议您采取以下措施:

后续步骤