

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

# 手動更新 Amazon ECS 容器代理程式 (適用於非 Amazon ECS 最佳化 AMI)
<a name="manually_update_agent"></a>

有時，您可能需要更新 Amazon ECS 容器代理程式，以取得錯誤修正和新功能。更新 Amazon ECS 容器代理不會中斷容器執行個體上正在執行中的任務或服務。
**注意**  
代理更新不適用於 Windows 容器執行個體。我們建議您啟動新的容器執行個體，以更新您 Windows 叢集中的代理版本。

1. 透過 SSH 登入您的容器執行個體。

1. 檢查以查看您的代理是否是使用 `ECS_DATADIR` 環境變數儲存其狀態。

   ```
   ubuntu:~$ docker inspect ecs-agent | grep ECS_DATADIR
   ```

   輸出：

   ```
   "ECS_DATADIR=/data",
   ```
**重要**  
若先前的命令並未傳回 `ECS_DATADIR` 環境變數，您必須停止任何在此容器執行個體上執行的任務，才能更新您的代理。較新的代理會使用 `ECS_DATADIR` 環境變數儲存其狀態，讓您可以在任務執行中時更新它們，而不會有任何問題。

1. 停用 Amazon ECS 容器代理程式。

   ```
   ubuntu:~$ docker stop ecs-agent
   ```

1. 刪除代理容器。

   ```
   ubuntu:~$ docker rm ecs-agent
   ```

1. 確認 `/etc/ecs` 目錄和 Amazon ECS 容器代理程式組態檔案存在於 `/etc/ecs/ecs.config`。

   ```
   ubuntu:~$ sudo mkdir -p /etc/ecs && sudo touch /etc/ecs/ecs.config
   ```

1. 編輯 `/etc/ecs/ecs.config` 檔案，並確保其至少包含以下變數宣告。若您不希望您的容器執行個體使用預設叢集註冊，請將叢集名稱指定為 `ECS_CLUSTER` 的值。

   ```
   ECS_DATADIR=/data
   ECS_ENABLE_TASK_IAM_ROLE=true
   ECS_ENABLE_TASK_IAM_ROLE_NETWORK_HOST=true
   ECS_LOGFILE=/log/ecs-agent.log
   ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","awslogs"]
   ECS_LOGLEVEL=info
   ECS_CLUSTER=default
   ```

   如需這些和其他代理執行時間選項的詳細資訊，請參閱「[Amazon ECS 容器代理程式組態](ecs-agent-config.md)」。
**注意**  
您可以選擇性地將您的代理程式環境變數存放在 Amazon S3 中 (可在啟動時使用 Amazon EC2 使用者資料將其下載到您的容器執行個體)。針對敏感性資訊 (例如私有存放庫的身分驗證登入資料)，此為建議選項。如需詳細資訊，請參閱[將 Amazon ECS 容器執行個體組態儲存於 Amazon S3 中](ecs-config-s3.md)及[在 Amazon ECS 中使用非AWS 容器映像](private-auth.md)。

1. 從 Amazon Elastic Container Registry Public 取出最新的 Amazon ECS 容器代理程式映像。

   ```
   ubuntu:~$ docker pull public.ecr.aws/ecs/amazon-ecs-agent:latest
   ```

   輸出：

   ```
   Pulling repository amazon/amazon-ecs-agent
   a5a56a5e13dc: Download complete
   511136ea3c5a: Download complete
   9950b5d678a1: Download complete
   c48ddcf21b63: Download complete
   Status: Image is up to date for amazon/amazon-ecs-agent:latest
   ```

1. 在您的容器執行個體上執行最新的 Amazon ECS 容器代理程式。
**注意**  
使用 Docker 重新啟動政策或處理序管理員 (例如 **upstart** 或 **systemd**) 將容器代理程式做為服務或常駐程式處理，並確保在結束後重新啟動它。因此 Amazon ECS 最佳化 AMI 會使用 `ecs-init` RPM，您可以在 GitHub 上檢視[此 RPM 的來源程式碼](https://github.com/aws/amazon-ecs-init)。

   以下代理程式執行命令範例分成獨立的各行來顯示每個選項。如需這些和其他代理執行時間選項的詳細資訊，請參閱「[Amazon ECS 容器代理程式組態](ecs-agent-config.md)」。
**重要**  
針對啟用 SELinux 的作業系統，需要在您的 **docker run** 命令中包含 `--privileged` 選項。此外，針對啟用 SELinux 的容器執行個體，我們建議您為 `/log` 和 `/data` 磁碟區掛載新增 `:Z` 選項。但是，這些磁碟區的主機掛載必須在您執行命令前存在，否則您會接收到 `no such file or directory` 錯誤。若您在啟用 SELinux 的容器執行個體上執行 Amazon ECS 代理程式時遭遇困難，請採取以下動作：  
在您的容器執行個體上建立主機磁碟區掛載點。  

     ```
     ubuntu:~$ sudo mkdir -p /var/log/ecs /var/lib/ecs/data
     ```
為以下 **docker run** 命令新增 `--privileged` 選項。
為以下 **docker run** 命令的 `/log` 和 `/data` 容器磁碟區掛載附加 `:Z` 選項 (例如，`--volume=/var/log/ecs/:/log:Z`)。

   ```
   ubuntu:~$ sudo docker run --name ecs-agent \
   --detach=true \
   --restart=on-failure:10 \
   --volume=/var/run:/var/run \
   --volume=/var/log/ecs/:/log \
   --volume=/var/lib/ecs/data:/data \
   --volume=/etc/ecs:/etc/ecs \
   --volume=/etc/ecs:/etc/ecs/pki \
   --net=host \
   --env-file=/etc/ecs/ecs.config \
   amazon/amazon-ecs-agent:latest
   ```
**注意**  
若您接收到 `Error response from daemon: Cannot start container` 訊息，您可以使用 **sudo docker rm ecs-agent** 命令刪除失敗的容器，並再度嘗試執行代理程式。