手动更新 Amazon ECS 容器代理(适用于非经 Amazon ECS 优化的 AMI) - Amazon Elastic Container Service

手动更新 Amazon ECS 容器代理(适用于非经 Amazon ECS 优化的 AMI)

有时,您可能需要更新 Amazon ECS 容器代理以获取错误修正和新功能。更新 Amazon ECS 容器代理不会中断容器实例上正在运行的任务或服务。

注意

代理更新不适用于 Windows 容器实例。我们建议您启动新的容器实例来更新您的 Windows 集群中的代理版本。

  1. 通过 SSH 登录到容器实例。

  2. 检查您的代理是否使用 ECS_DATADIR 环境变量保存其状态。

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

    输出:

    "ECS_DATADIR=/data",
    重要

    如果上一个命令未返回 ECS_DATADIR 环境变量,则您在更新代理前必须停止在此容器实例上运行的任何任务。具有 ECS_DATADIR 环境变量的较新的代理将保存其状态,您可以在任务运行的同时更新它们,而不会出现问题。

  3. 停止 Amazon ECS 容器代理。

    ubuntu:~$ docker stop ecs-agent
  4. 删除代理容器。

    ubuntu:~$ docker rm ecs-agent
  5. 确保 /etc/ecs/ecs.config中存在 /etc/ecs 目录和 Amazon ECS 容器代理配置文件。

    ubuntu:~$ sudo mkdir -p /etc/ecs && sudo touch /etc/ecs/ecs.config
  6. 编辑 /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 容器代理配置

    注意

    您可以选择将代理环境变量存储在 Amazon S3 中(可在启动时使用 Amazon EC2 用户数据将其下载到容器实例)。建议对敏感信息(如私有存储库的身份验证凭证)采用此方法。有关更多信息,请参阅 将 Amazon ECS 容器实例配置存储在 Amazon S3 中在 Amazon ECS 中使用非 AWS 容器映像

  7. 从 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
  8. 在容器实例上运行最新的 Amazon ECS 容器代理。

    注意

    使用 Docker 重新启动策略或进程管理器(如 upstartsystemd)将容器代理作为服务或守护程序处理,并确保在容器代理退出后重新启动它。经 Amazon ECS 优化的 AMI 使用 ecs-init RPM 达到此目的,并且您可以在 GitHub 上查看此 RPM 的源代码

    以下示例代理运行命令分为若干个单独的行以显示每个选项。有关这些和其他代理运行时选项的更多信息,请参阅 Amazon ECS 容器代理配置

    重要

    运行启用了 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 命令删除失败的容器并重新尝试运行代理。