Amazon ECR 中用于私有工作流程的容器镜像 - AWS HealthOmics

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon ECR 中用于私有工作流程的容器镜像

在创建私有工作流程之前,您需要为工作流程创建容器映像。您将图片上传到亚马逊弹性容器注册表 (Amazon ECR) Container Registry 中的私有镜像存储库。当您运行工作流程时,该 HealthOmics 服务会访问您提供的容器。

容器映像 Amazon ECR 存储库必须与调用服务的账户位于同一 AWS 区域。只要源镜像存储库提供适当的权限,其他人 AWS 账户 就可以拥有容器镜像。有关更多信息,请参阅 Amazon 弹性容器注册表共享工作流程存储库政策

我们建议您将您的 Amazon ECR 容器映 URIs 像定义为工作流程中的参数,以便在运行开始之前可以验证访问权限。通过更改 Region 参数,还可以更轻松地在新区域中运行工作流程。

注意

HealthOmics 不支持 ARM 容器,也不支持访问公共仓库。

有关为访问 Amazon ECR 配置 IAM 权限的信息,请参阅资源权限。 HealthOmics

Amazon ECR 容器镜像的一般注意事项

  • 架构

    HealthOmics 支持 x86_64 容器。如果您的本地计算机基于 ARM(例如 Apple Mac),请使用如下命令构建 x86_64 容器镜像:

    docker build --platform amd64 -t my_tool:latest .
  • 入口点和外壳

    HealthOmics 工作流引擎将 bash 脚本作为命令替换注入到工作流任务使用的容器镜像中。因此,应在没有指定的 ENTRYPOINT 的情况下构建容器映像,以便默认使用 bash shell。

  • 已安装的路径

    共享文件系统挂载到位于 /tmp 的容器任务。在此位置的容器镜像中内置的任何数据或工具都将被覆盖。

    工作流定义可通过 /mnt/workflow 上的只读挂载供任务使用。

  • 映像大小

    HealthOmics 工作流程固定大小配额有关容器镜像的最大尺寸,请参阅。

HealthOmics 工作流程的环境变量

HealthOmics 提供了环境变量,这些变量包含有关容器中运行的工作流程的信息。您可以在工作流程任务的逻辑中使用这些变量的值。

所有 HealthOmics 工作流程变量都以AWS_WORKFLOW_前缀开头。此前缀是受保护的环境变量前缀。请勿在工作流程容器中为自己的变量使用此前缀。

HealthOmics 提供了以下工作流环境变量:

AWS_REGION

此变量是容器运行的区域。

AWS_WORKFLOW_RUN

此变量是当前运行的名称。

AWS_WORKFLOW_RUN_ID

此变量是当前运行的运行标识符。

AWS_WORKFLOW_RUN_UUID

此变量是当前运行的运行 UUID。

AWS_WORKFLOW_TASK

此变量是当前任务的名称。

AWS_WORKFLOW_任务_ID

此变量是当前任务的任务标识符。

AWS_WORKFLOW_TASK_UUID

此变量是当前任务的任务 UUID。

以下示例显示了每个环境变量的典型值:

AWS Region: us-east-1 Workflow Run: arn:aws:omics:us-east-1:123456789012:run/6470304 Workflow Run ID: 6470304 Workflow Run UUID: f4d9ed47-192e-760e-f3a8-13afedbd4937 Workflow Task: arn:aws:omics:us-east-1:123456789012:task/4192063 Workflow Task ID: 4192063 Workflow Task UUID: f0c9ed49-652c-4a38-7646-60ad835e0a2e

在 Amazon ECR 容器镜像中使用 Java

如果工作流任务使用 Java 应用程序(例如 GATK),请考虑容器的以下内存要求:

  • Java 应用程序使用堆栈内存和堆内存。默认情况下,最大堆内存是容器中总可用内存的百分比。此默认值取决于特定的 JVM 发行版和 JVM 版本,因此请查阅 JVM 的相关文档,或者使用 Java 命令行选项(例如 `-Xmx)明确设置堆内存最大值。

  • 不要将最大堆内存设置为容器内存分配的 100%,因为 JVM 堆栈也需要内存。JVM 垃圾收集器和容器中运行的任何其他操作系统进程也需要内存。

  • 某些 Java 应用程序(例如 GATK)可以使用本机方法调用或其他优化,例如内存映射文件。这些技术需要在 “堆外” 执行的内存分配,这些分配不受JVM最大堆参数的控制。

    如果您知道(或怀疑)您的 Java 应用程序分配了堆外内存,请确保您的任务内存分配包括堆外内存需求。

    如果这些堆外分配导致容器内存不足,则通常不会看到 Java OutOfMemory 错误,因为 JVM 无法控制此内存。

向 ECR 容器镜像添加任务输入

将运行工作流程任务所需的所有可执行文件、库和脚本添加到用于运行该任务的 Amazon ECR 映像中。

最佳做法是避免使用任务容器镜像外部的脚本、二进制文件和库。当使用使用bin目录作为nf-core工作流包一部分的工作流时,这一点尤其重要。虽然此目录可供工作流任务使用,但它是作为只读目录安装的。应将此目录中的所需资源复制到任务镜像中,并在运行时或构建用于任务的容器映像时提供。

HealthOmics 工作流程固定大小配额有关 HealthOmics 支持的容器镜像的最大大小,请参阅。