

# 手动更新 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/ecs.config`中存在 `/etc/ecs` 目录和 Amazon ECS 容器代理配置文件。

   ```
   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
     ```
将 `--privileged` 选项添加到下面的 **docker run** 命令中。
将 `:Z` 选项追加到针对下面的 **docker run** 命令的 `/log` 和 `/data` 容器卷挂载（例如 `--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** 命令删除失败的容器并重新尝试运行代理。