

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 容器映像的最佳實務
<a name="containers-best-practices"></a>

當您為 HealthOmics 工作流程建置容器映像時，請遵循這些最佳實務。

## 在 Amazon ECR 容器映像中使用 Java
<a name="ecr-java-considerations"></a>

如果工作流程任務使用 Java 應用程式，例如 GATK，請考慮容器的下列記憶體需求：
+ Java 應用程式使用堆疊記憶體和堆積記憶體。根據預設，堆積記憶體上限是容器中可用記憶體總數的百分比。此預設值取決於特定的 JVM 分佈和 JVM 版本，因此請參閱 JVM 的相關文件，或使用 Java 命令列選項 （例如 ) 明確設定堆積記憶體上限`-Xmx`。
+ 請勿將堆積記憶體上限設定為容器記憶體配置的 100%，因為 JVM 堆疊也需要記憶體。JVM 垃圾收集器和在容器中執行的任何其他作業系統程序也需要記憶體。
+ 有些 Java 應用程式，例如 GATK，可以使用原生方法叫用或其他最佳化，例如記憶體映射檔案。這些技術需要「非堆積」執行的記憶體配置，JVM 堆積上限參數無法控制。

  如果您知道 （或懷疑） Java 應用程式配置堆積外記憶體，請確定任務記憶體配置包含堆積外記憶體需求。

  如果這些堆積外配置導致容器耗盡記憶體，您通常不會看到 Java `OutOfMemory`錯誤，因為 JVM 無法控制此記憶體。

## 將任務輸入新增至 Amazon ECR 容器映像
<a name="ecr-tasks"></a>

將執行工作流程任務所需的所有可執行檔、程式庫和指令碼新增至用於執行任務的 Amazon ECR 映像。

最佳實務是避免使用任務容器映像外部的指令碼、二進位檔和程式庫。這在使用將`bin`目錄做為`nf-core`工作流程套件一部分的工作流程時特別重要。雖然此目錄可供工作流程任務使用，但它會掛載為唯讀目錄。此目錄中的必要資源應複製到任務映像，並在執行時間或建置用於任務的容器映像時提供。

[HealthOmics 工作流程固定大小配額](fixed-quotas.md#fixed-quotas-workflows) 如需 HealthOmics 支援的容器映像大小上限，請參閱 。

## 使用摘要或版本而非非 PTC 影像的標籤
<a name="containers-best-practices-non-ptc-pin"></a>

對於來自提取快取之登錄檔的容器映像不支援，例如 Seqera、NVIDIANGC 和 Google Artifact Registry，請參考摘要或版本，而非標籤，例如 `latest`。HealthOmics 會在任務第一次需要時複製映像，而不會重新整理複本，因此上游變更的標籤會繼續解析為較早的複本。如需詳細資訊，請參閱[使用提取快取不支援的第三方登錄檔](containers-non-ptc-registries.md)。

下列範例依版本和摘要參考 Seqera Containers 映像：

```
community.wave.seqera.io/library/htslib_samtools:1.24--d697cfb9dce007cd@sha256:a55ddea590e567a91df592300a960aa534cfc1bd16e7623e3938ec21f4f3df15
```