

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

# 自訂 Amazon EMR on EKS 的 Docker 映像檔
<a name="docker-custom-images"></a>

可搭配使用自訂 Docker 映像檔與 Amazon EMR on EKS。自訂 Amazon EMR on EKS 執行期映像具有下列優點：
+ 將應用程式相依性和執行期環境封裝到單一不可變容器中，以提升可攜性並簡化每個工作負載的相依性管理。
+ 安裝和設定針對您的工作負載進行優化的套件。這些套件可能無法在 Amazon EMR 執行期的公開發佈中廣泛使用。
+ 將 Amazon EMR on EKS 與組織內目前建立的建置、測試和部署程序整合，包括本機開發和測試。
+ 套用已建立的安全程序，例如影像掃描，以符合組織內的合規和監管要求。

**Topics**
+ [如何自訂 Docker 映像檔](docker-custom-images-steps.md)
+ [選取基礎映像 URI 的詳細資訊](docker-custom-images-tag.md)
+ [自訂映像的考量事項](docker-custom-images-considerations.md)

# 如何自訂 Docker 映像檔
<a name="docker-custom-images-steps"></a>

請依照下列步驟來自訂 Amazon EMR on EKS 的 Docker 映像。這些步驟說明如何取得基礎映像、自訂和發佈映像，以及使用映像提交工作負載。
+ [先決條件](#docker-custom-images-prereq)
+ [步驟 1：從 Amazon Elastic Container Registry (Amazon ECR) 中擷取基礎映像](#docker-custom-images-retrieve)
+ [步驟 2：自訂基礎映像](#docker-custom-images-customize)
+ [步驟 3：(選用但不推薦) 驗證自訂映像](#docker-custom-images-validate)
+ [步驟 4：發布自訂映像](#docker-custom-images-publish)
+ [步驟 5：使用自訂映像在 Amazon EMR 中提交 Spark 工作負載](#docker-custom-images-submit)

**注意**  
自訂 Docker 映像時，您可能想要考慮的其他選項是針對互動式端點進行自訂，這是為了確保您擁有所需的相依性，或使用多架構容器映像：  
[為互動端點自訂 Docker 映像檔](docker-custom-images-managed-endpoint.md)
[使用多架構映像](docker-custom-images-multi-architecture.md)

## 先決條件
<a name="docker-custom-images-prereq"></a>
+ 完成 Amazon EMR on EKS 的 [設定 Amazon EMR on EKS](setting-up.md) 步驟。
+ 在您的環境中安裝 Docker。如需詳細資訊，請參閱[獲取 Docker](https://docs.docker.com/get-docker/)。

## 步驟 1：從 Amazon Elastic Container Registry (Amazon ECR) 中擷取基礎映像
<a name="docker-custom-images-retrieve"></a>

基礎映像包含 Amazon EMR 執行期和用於存取其他 AWS 服務的連接器。對於 Amazon EMR 6.9.0 及更高版本，您可從 Amazon ECR 公共映像庫中獲取基礎映像。瀏覽圖庫以尋找映像連結，然後將映像拉到本地工作區。例如，對於 Amazon EMR 7.12.0 版本，以下`docker pull`命令會取得最新的標準基礎映像。您可以將 `emr-7.12.0:latest` 取代為 `emr-7.12.0-spark-rapids:latest`，以擷取具有 Nvidia RAPIDS Accelerator 的映像。也可以將 `emr-7.12.0:latest` 取代為 `emr-7.12.0-java11:latest`，以使用 Java 11 執行期來擷取映像。

```
docker pull public.ecr.aws/emr-on-eks/spark/emr-7.12.0:latest
```

如果想要擷取 Amazon EMR 6.9.0 或更早版本的基礎映像，或者想要從每個區域的 Amazon ECR 登錄檔帳戶中擷取，請使用下列步驟：

1. 選擇基礎映像 URI。映像 URI 遵循此格式，`ECR-registry-account.dkr.ecr.Region.amazonaws.com/spark/container-image-tag`，如下列範例所示。

   ```
   895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   ```

   若要在您的區域中選擇基礎映像，請參閱 [選取基礎映像 URI 的詳細資訊](docker-custom-images-tag.md)。

1. 登入儲存基礎映像的 Amazon ECR 儲存庫。將 *895885662937* 和 *us-west-2* 取代為您選取的 Amazon ECR 登錄帳戶和 AWS 區域。

   ```
   aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin 895885662937.dkr.ecr.us-west-2.amazonaws.com
   ```

1. 將基礎映像拉入本機工作區。將 *emr-6.6.0:latest* 取代為您選取的容器映像標籤。

   ```
   docker pull 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   ```

## 步驟 2：自訂基礎映像
<a name="docker-custom-images-customize"></a>

請依照下列步驟來自訂您從 Amazon ECR 提取的基礎映像。

1. 在您的本機工作區建立新的 `Dockerfile`。

1. 編輯您剛建立的 `Dockerfile`，並新增下列內容。此 `Dockerfile` 使用您從 `895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest` 中提取的容器映像。

   ```
   FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   USER root
   ### Add customization commands here ####
   USER hadoop:hadoop
   ```

1. 在 `Dockerfile` 中新增命令以自訂基礎映像。例如，新增一個命令來安裝 Python 程式庫，如以下 `Dockerfile` 所示。

   ```
   FROM 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   USER root
   RUN pip3 install --upgrade boto3 pandas numpy // For python 3
   USER hadoop:hadoop
   ```

1. 從建立 `Dockerfile` 所在的相同目錄中，執行下列命令以建置 Docker 映像檔。提供 Docker 映像檔的名稱，例如 *emr6.6\$1custom*。

   ```
   docker build -t emr6.6_custom .
   ```

## 步驟 3：(選用但不推薦) 驗證自訂映像
<a name="docker-custom-images-validate"></a>

建議您在發布自訂映像之前先測試它的相容性。您可以使用 [Amazon EMR on EKS 自訂映像檔 CLI](https://github.com/awslabs/amazon-emr-on-eks-custom-image-cli) 來檢查映像是否具有必要的檔案結構和正確的組態，以便在 Amazon EMR on EKS 上執行。

**注意**  
Amazon EMR on EKS 自訂映像 CLI 無法確認您的映像是否沒有錯誤。從基礎映像中移除相依性時，請小心謹慎。

採取下列步驟來驗證自訂映像。

1. 下載並安裝 Amazon EMR on EKS 自訂映像 CLI。如需詳細資訊，請參閱 [Amazon EMR on EKS 自訂映像 CLI 安裝指南](https://github.com/awslabs/amazon-emr-on-eks-custom-image-cli/blob/main/installer/assets/INSTALLATION_GUIDE.md)。

1. 執行下列命令以測試安裝。

   ```
   emr-on-eks-custom-image --version
   ```

   以下顯示輸出範例。

   ```
   Amazon EMR on EKS Custom Image CLI
   Version: x.xx
   ```

1. 執行以下命令來驗證自訂映像。

   ```
   emr-on-eks-custom-image validate-image -i image_name -r release_version [-t image_type]
   ```
   + `-i` 指定需要驗證的本機映像 URI。這可以是映像 URI、您為映像定義的任何名稱或標記。
   + `-r` 指定基礎映像的確切發行版本，例如，`emr-6.6.0-latest`。
   + `-t` 指定映像類型。如果為 Spark 映像，請輸入 `spark`。預設值為 `spark`。目前的 Amazon EMR on EKS 自訂映像 CLI 版本僅支援 Spark 執行期映像。

   如果成功執行命令，且自訂映像符合所有必要的組態和檔案結構，則傳回的輸出會顯示所有測試結果，如下列範例所示。

   ```
   Amazon EMR on EKS Custom Image Test
   Version: x.xx
   ... Checking if docker cli is installed
   ... Checking Image Manifest
   [INFO] Image ID: xxx
   [INFO] Created On: 2021-05-17T20:50:07.986662904Z
   [INFO] Default User Set to hadoop:hadoop : PASS
   [INFO] Working Directory Set to /home/hadoop : PASS
   [INFO] Entrypoint Set to /usr/bin/entrypoint.sh : PASS
   [INFO] SPARK_HOME is set with value: /usr/lib/spark : PASS
   [INFO] JAVA_HOME is set with value: /etc/alternatives/jre : PASS
   [INFO] File Structure Test for spark-jars in /usr/lib/spark/jars: PASS
   [INFO] File Structure Test for hadoop-files in /usr/lib/hadoop: PASS
   [INFO] File Structure Test for hadoop-jars in /usr/lib/hadoop/lib: PASS
   [INFO] File Structure Test for bin-files in /usr/bin: PASS
   ... Start Running Sample Spark Job
   [INFO] Sample Spark Job Test with local:///usr/lib/spark/examples/jars/spark-examples.jar : PASS
   -----------------------------------------------------------------
   Overall Custom Image Validation Succeeded.
   -----------------------------------------------------------------
   ```

   如果自訂映像不符合所需的組態或檔案結構，就會出現錯誤訊息。傳回的輸出會提供有關不正確組態或檔案結構的相關資訊。

## 步驟 4：發布自訂映像
<a name="docker-custom-images-publish"></a>

將新的 Docker 映像檔發布至 Amazon ECR 登錄檔。

1. 執行下列命令以建立用於存放 Docker 映像檔的 Amazon ECR 儲存庫。*為您的儲存庫提供名稱，例如 emr6.6\$1custom\$1repo*。將 *us-west-2* 取代為您的區域。

   ```
   aws ecr create-repository \
       --repository-name emr6.6_custom_repo \
       --image-scanning-configuration scanOnPush=true \
       --region us-west-2
   ```

   如需詳細資訊，請參閱《Amazon ECR 使用者指南》**中的[建立儲存庫](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-create-repository)。

1. 執行下列命令以驗證預設登錄檔。

   ```
   aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.us-west-2.amazonaws.com
   ```

   如需詳細資訊，請參閱《Amazon ECR 使用者指南》**中的[驗證預設登錄檔](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-authenticate-registry)。

1. 標記映像並將其發布至您建立的 Amazon ECR 儲存庫。

   標記映像。

   ```
   docker tag emr6.6_custom aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo
   ```

   推送映像。

   ```
   docker push aws_account_id.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo
   ```

   如需詳細資訊，請參閱《Amazon ECR 使用者指南》**中的[將映像推送至 Amazon ECR](https://docs.aws.amazon.com/AmazonECR/latest/userguide/getting-started-cli.html#cli-push-image)。

## 步驟 5：使用自訂映像在 Amazon EMR 中提交 Spark 工作負載
<a name="docker-custom-images-submit"></a>

建立並發布自訂映像後，可以使用自訂映像來提交 Amazon EMR on EKS 作業。

首先，建立 start-job-run-request.json 檔案，並指定 `spark.kubernetes.container.image` 參數來參考自訂映像，如下面的 JSON 檔案範例所示。

**注意**  
可以使用 `local://` 結構描述來參考自訂映像中的可用檔案，如下面的 JSON 程式碼片段中的 `entryPoint` 引數所示。也可以使用 `local://` 結構描述來參考應用程式相依性。使用 `local://` 結構描述所參考的所有檔案和相依性必須已存在於自訂映像的指定路徑中。

```
{
    "name": "spark-custom-image", 
    "virtualClusterId": "virtual-cluster-id", 
    "executionRoleArn": "execution-role-arn", 
    "releaseLabel": "emr-6.6.0-latest", 
    "jobDriver": {
      "sparkSubmitJobDriver": {
        "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", 
        "entryPointArguments": [
                  "10"
              ],
         "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi --conf spark.kubernetes.container.image=123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo"
       }
    }
}
```

也可以參考具有 `applicationConfiguration` 屬性的自訂映像，如下列範例所示。

```
{
    "name": "spark-custom-image", 
    "virtualClusterId": "virtual-cluster-id", 
    "executionRoleArn": "execution-role-arn", 
    "releaseLabel": "emr-6.6.0-latest", 
    "jobDriver": {
      "sparkSubmitJobDriver": {
        "entryPoint": "local:///usr/lib/spark/examples/jars/spark-examples.jar", 
        "entryPointArguments": [
                  "10"
              ],
         "sparkSubmitParameters": "--class org.apache.spark.examples.SparkPi"
       }
    },
    "configurationOverrides": {
        "applicationConfiguration": [
            {
                "classification": "spark-defaults",
                "properties": {
                    "spark.kubernetes.container.image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/emr6.6_custom_repo"
                }
            }
        ]
    }
}
```

然後執行 `start-job-run` 命令以提交作業。

```
aws emr-containers start-job-run --cli-input-json file://./start-job-run-request.json
```

在上面的 JSON 範例中，請將 *emr-6.6.0-latest* 取代為您的 Amazon EMR 發行版本。強烈建議您使用 `-latest` 發行版本，以確保選取的版本包含最新安全更新。如需有關 Amazon EMR 發行版本和其映像標籤的詳細資訊，請參閱 [選取基礎映像 URI 的詳細資訊](docker-custom-images-tag.md)。

**注意**  
可以使用 `spark.kubernetes.driver.container.image` 和 `spark.kubernetes.executor.container.image` 為驅動程式和執行程式 Pod 指定不同的映像。

# 為互動端點自訂 Docker 映像檔
<a name="docker-custom-images-managed-endpoint"></a>

也可以為互動端點自訂 Docker 映像檔，以便執行自訂的基礎核心映像。這有助於確保從 EMR Studio 執行互動式工作負載時擁有所需的相依性。

1. 請依照上述[步驟 1-4](https://docs.aws.amazon.com/emr/latest/EMR-on-EKS-DevelopmentGuide/docker-custom-images-steps.html#docker-custom-images-retrieve) 自訂 Docker 映像檔。對於 Amazon EMR 6.9.0 及更高版本，您可從 Amazon ECR 公共映像庫中獲取基礎映像 URI。對於 Amazon EMR 6.9.0 之前的版本，可以在每個 AWS 區域的 Amazon EMR Registry 帳戶中獲取映像，唯一的區別是 Dockerfile 中的基礎映像 URI。基礎映像 URI 的格式如下：

   ```
   ECR-registry-account.dkr.ecr.Region.amazonaws.com/notebook-spark/container-image-tag
   ```

   需要在基礎映像 URI 中使用 `notebook-spark` 而非 `spark`。基礎映像包含 Spark 執行期和隨之一起執行的筆記本核心。如需有關選取區域和容器映像標籤的詳細資訊，請參閱 [選取基礎映像 URI 的詳細資訊](docker-custom-images-tag.md)。
**注意**  
目前僅支援覆寫基礎映像，且不支援引入非基礎映像 AWS 提供之其他類型的全新核心。

1. 建立可與自訂映像搭配使用的互動端點。

   首先，建立稱為 `custom-image-managed-endpoint.json` 的 JSON 檔案，其中具有以下內容。

   ```
   {
       "name": "endpoint-name",
       "virtualClusterId": "virtual-cluster-id",
       "type": "JUPYTER_ENTERPRISE_GATEWAY",
       "releaseLabel": "emr-6.6.0-latest",
       "executionRoleArn": "execution-role-arn",
       "certificateArn": "certificate-arn",
       "configurationOverrides": {
           "applicationConfiguration": [
               {
                   "classification": "jupyter-kernel-overrides",
                   "configurations": [
                       {
                           "classification": "python3",
                           "properties": {
                               "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-python:latest"
                           }
                       },
                       {
                           "classification": "spark-python-kubernetes",
                           "properties": {
                               "container-image": "123456789012.dkr.ecr.us-west-2.amazonaws.com/custom-notebook-spark:latest"
                           }
                       }
                   ] 
               }
           ]
       }
   }
   ```

   接下來，使用 JSON 檔案中指定的組態建立互動端點，如下列範例所示。

   ```
   aws emr-containers create-managed-endpoint --cli-input-json custom-image-managed-endpoint.json
   ```

   如需詳細資訊，請參閱[為虛擬叢集建立互動端點](https://docs.aws.amazon.com/emr/latest/ManagementGuide/emr-studio-create-eks-cluster.html#emr-studio-create-managed-endpoint)。

1. 透過 EMR Studio 連接至互動端點。如需詳細資訊，請參閱[從 Studio 連接](https://emr-on-eks.workshop.aws/advanced/emr-studio/connecting-from-studio.html)。

# 使用多架構映像
<a name="docker-custom-images-multi-architecture"></a>

Amazon EMR on EKS 支援 Amazon Elastic Container Registry (Amazon ECR) 的多架構容器映像。如需詳細資訊，請參閱[為 Amazon ECR 引入多架構容器映像](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr/)。

Amazon EMR on EKS 自訂映像支援 AWS Graviton 型 EC2 執行個體non-Graviton-based EC2 執行個體。Graviton 型映像會與非 Graviton 型映像儲存在 Amazon ECR 的相同映像儲存庫中。

例如，若要檢查 Docker 清單檔案是否有 6.6.0 映像，請執行下列命令。

```
docker manifest inspect 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest 
```

此處為輸出。`arm64` 架構適用於 Graviton 執行個體。`amd64` 適用於非 Graviton 執行個體。

```
{
   "schemaVersion": 2,
   "mediaType": "application/vnd.docker.distribution.manifest.list.v2+json",
   "manifests": [
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1805,
         "digest": "xxx123:6b971cb47d11011ab3d45fff925e9442914b4977ae0f9fbcdcf5cfa99a7593f0",
         "platform": {
            "architecture": "arm64",
            "os": "linux"
         }
      },
      {
         "mediaType": "application/vnd.docker.distribution.manifest.v2+json",
         "size": 1805,
         "digest": "xxx123:6f2375582c9c57fa9838c1d3a626f1b4fc281e287d2963a72dfe0bd81117e52f",
         "platform": {
            "architecture": "amd64",
            "os": "linux"
         }
      }
   ]
}
```

遵循下列步驟來建立多架構映像：

1. 使用以下內容建立 `Dockerfile`，以便可以提取 `arm64` 映像。

   ```
   FROM --platform=arm64 895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-6.6.0:latest
   USER root
    
   RUN pip3 install boto3 // install customizations here
   USER hadoop:hadoop
   ```

1. 遵循[為 Amazon ECR 引入多架構容器映像](https://aws.amazon.com/blogs/containers/introducing-multi-architecture-container-images-for-amazon-ecr/)中的說明，以建置多架構映像。
**注意**  
必須在 `arm64` 執行個體上建立 `arm64` 映像。同樣，必須在 `amd64` 執行個體上建置 `amd64` 映像。

   也可以建置多架構映像，而不必使用 Docker `buildx` 命令在每個特定的執行個體類型上建置。如需詳細資訊，請參閱[利用多 CPU 架構支援](https://docs.docker.com/desktop/multi-arch/)。

1. 建立多架構映像後，可以提交具有相同 `spark.kubernetes.container.image` 參數的作業，並將其指向映像。在同時具有 AWS Graviton 型non-Graviton-based EC2 執行個體的異質叢集中，執行個體會根據提取映像的執行個體架構來判斷正確的架構映像。

# 選取基礎映像 URI 的詳細資訊
<a name="docker-custom-images-tag"></a>

**注意**  
對於 Amazon EMR 6.9.0 版和更高版本，可以從 Amazon ECR 公共映像庫中擷取基礎映像，因此您不需要按照本頁面中的說明直接建構基礎映像 URI。若要尋找基礎映像的容器映像標籤，請參閱[版本說明頁面](emr-eks-releases.md)，了解 Amazon EMR on EKS 的對應版本。

您選取的基礎 Docker 映像檔儲存在 Amazon Elastic Container Registry (Amazon ECR) 中。映像 URI 遵循此格式：`ECR-registry-account.dkr.ecr.Region.amazonaws.com/spark/container-image-tag`，如下列範例所示。

```
895885662937.dkr.ecr.us-west-2.amazonaws.com/spark/emr-7.12.0:latest
```

互動端點的映像 URI 遵循此格式：`ECR-registry-account.dkr.ecr.Region.amazonaws.com/notebook-spark/container-image-tag`，如下列範例所示。需要在基礎映像 URI 中使用 `notebook-spark` 而非 `spark`。

```
895885662937.dkr.ecr.us-west-2.amazonaws.com/notebook-spark/emr-7.12.0:latest
```

同樣，對於互動端點的非 Spark `python3` 映像，映像 URI 為 `ECR-registry-account.dkr.ecr.Region.amazonaws.com/notebook-python/container-image-tag`。下列範例 URI 已正確格式化：

```
895885662937.dkr.ecr.us-west-2.amazonaws.com/notebook-python/emr-7.12.0:latest
```

若要尋找基礎映像的容器映像標籤，請參閱[版本說明頁面](emr-eks-releases.md)，了解 Amazon EMR on EKS 的對應版本。

## 按區域劃分的 Amazon ECR 登錄檔帳戶
<a name="docker-custom-images-ECR"></a>

若要避免高網路延遲，請從最近的位置提取基礎映像 AWS 區域。根據下表，選取與您從中提取映像的區域所對應的 Amazon ECR 登錄檔帳戶。


| 大區 (Regions) | Amazon ECR 登錄檔帳戶 | 
| --- | --- | 
| ap-east-1 | 736135916053 | 
| ap-northeast-1 | 059004520145 | 
| ap-northeast-2 | 996579266876 | 
| ap-northeast-3 | 705689932349 | 
| ap-southeast-3 | 946962994502 | 
| ap-south-1 | 235914868574 | 
| ap-south-2 | 691480105545 | 
| ap-southeast-1 | 671219180197 | 
| ap-southeast-2 | 038297999601 | 
| ca-central-1 | 351826393999 | 
| eu-central-1 | 107292555468 | 
| eu-central-2 | 314408114945 | 
| eu-north-1 | 830386416364 | 
| eu-west-1 | 483788554619 | 
| eu-west-2 | 118780647275 | 
| eu-west-3 | 307523725174 | 
| eu-south-1 | 238014973495 | 
| eu-south-2 | 350796622945 | 
|  il-central-1 | 395734710648 | 
| me-south-1 | 008085056818 | 
| me-central-1 | 818935616732 | 
| sa-east-1 | 052806832358 | 
| us-gov-west-1 | 299385240661 | 
| us-gov-east-1 | 299393998622 | 
| us-east-1 | 755674844232 | 
| us-east-2 | 711395599931 | 
| us-west-1 | 608033475327 | 
| us-west-2 | 895885662937 | 
| af-south-1 | 358491847878 | 
| cn-north-1 | 068337069695 | 
| cn-northwest-1 | 068420816659 | 

# 自訂映像的考量事項
<a name="docker-custom-images-considerations"></a>

當您自訂 Docker 映像檔時，可以為您的作業選擇精確的執行期。使用此功能時，請考慮這些最佳實務。其中包括安全性、組態和掛載映像的考量：
+ 安全性是 AWS 與您之間的共同責任。您負責對新增至映像的二進位檔案進行安全修補。遵循 [Amazon EMR on EKS 安全最佳實務](security-best-practices.md)，尤其是 [取得自訂映像的最新安全更新](security-best-practices.md#security-custom-image) 和 [套用最低權限準則](security-best-practices.md#security-least-privilege)。
+ 當您自訂基礎映像時，必須將 Docker 使用者變更為 `hadoop:hadoop`，以便作業不會與根使用者一起執行。
+ Amazon EMR on EKS 會在執行階段將檔案掛載在映像的組態之上，例如 `spark-defaults.conf`。若要覆寫這些組態檔案，建議您在作業提交期間使用 `applicationOverrides` 參數，而不要直接修改自訂映像中的檔案。
+ Amazon EMR on EK 會在執行階段掛載特定資料夾。您對這些資料夾所做的任何修改都無法在容器中使用。如果您要為自訂映像新增應用程式或其相依性，建議您選擇不屬於下列預先定義路徑的目錄：
  + `/var/log/fluentd`
  + `/var/log/spark/user`
  + `/var/log/spark/apps`
  + `/mnt`
  + `/tmp`
  + `/home/hadoop`
+ 您可以將自訂映像上傳到任何與 Docker 相容的儲存庫，例如 Amazon ECR、Docker Hub 或私有企業儲存庫。如需有關如何使用選取的 Docker 儲存庫設定 Amazon EKS 叢集身分驗證的詳細資訊，請參閱[從私有登錄檔提取映像](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)。