

# 在 AWS CLI 中运行官方 Amazon ECR Public 映像或 Docker 映像
<a name="getting-started-docker"></a>

本主题介绍如何使用官方 Amazon Elastic Container Registry Public (Amazon ECR Public) 或 Docker Hub 映像，在 Docker 上运行、配置 AWS CLI 版本 2 以及对其进行版本控制。有关如何使用 Docker 的更多信息，请参阅 [Docker 的文档](https://docs.docker.com/)。

官方映像提供 AWS 直接支持和维护的隔离、可移植性和安全性。这使您能够在基于容器的环境中使用 AWS CLI 版本 2，而无需自行管理安装。

**Topics**
+ [先决条件](#cliv2-docker-prereq)
+ [在 Amazon ECR Public 和 Docker Hub 之间作出选择](#cliv2-docker-versus)
+ [运行官方 AWS CLI 版本 2 映像](#cliv2-docker-install)
+ [有关官方映像的接口和向后兼容性的说明](#cliv2-docker-install-notes)
+ [使用特定版本和标签](#cliv2-docker-upgrade)
+ [更新到最新的官方映像](#cliv2-docker-update)
+ [共享主机文件、凭据、环境变量和配置](#cliv2-docker-share-files)
+ [缩短 docker run 命令](#cliv2-docker-aliases)

## 先决条件
<a name="cliv2-docker-prereq"></a>

您必须已经安装 Docker。有关安装说明，请参阅 [Docker 网站](https://docs.docker.com/install/)。

要验证 Docker 的安装，请运行以下命令并确认是否有输出。

```
$ docker --version
Docker version 19.03.1
```

## 在 Amazon ECR Public 和 Docker Hub 之间作出选择
<a name="cliv2-docker-versus"></a>

我们建议为 AWS CLI 映像使用 Amazon ECR Public，而不使用 Docker Hub。Docker Hub 对公有使用者有更严格的速率限制，这会导致出现节流问题。此外，Amazon ECR Public 会在多个区域复制映像，以提供强大的可用性和处理区域中断问题。

有关 Docker Hub 速率限制的更多信息，请参阅 *Docker* 网站上的[了解 Docker Hub 速率限制](https://www.docker.com/increase-rate-limits/)。

## 运行官方 AWS CLI 版本 2 映像
<a name="cliv2-docker-install"></a>

 首次使用 `docker run` 命令时，系统会将最新映像下载到计算机。`docker run` 命令的每次后续使用都会从本地副本运行。

要运行 AWS CLI 版本 2 Docker 映像，请使用 `docker run` 命令。

------
#### [ Amazon ECR Public ]

官方 AWS CLI 版本 2 Amazon ECR Public 映像托管在 [`aws-cli/aws-cli` 存储库](https://gallery.ecr.aws/aws-cli/aws-cli)中的 Amazon ECR Public 上。

```
$ docker run --rm -it public.ecr.aws/aws-cli/aws-cli command
```

------
#### [ Docker Hub ]

官方 AWS CLI 版本 2 Docker 映像托管在 `amazon/aws-cli` 存储库中的 Docker Hub 上。

```
$ docker run --rm -it amazon/aws-cli command
```

------

下面是此命令运行方式：
+ `docker run --rm -it repository/name` – 等效于 `aws` 可执行文件。每次运行此命令时，Docker 都会启动已下载映像的容器，并执行您的 `aws` 命令。默认情况下，映像使用 AWS CLI 版本 2 的最新版本。

  例如，要在 Docker 中调用 `aws --version` 命令，请运行以下命令。

------
#### [ Amazon ECR Public ]

  ```
  $ docker run --rm -it public.ecr.aws/aws-cli/aws-cli --version
  aws-cli/2.27.41 Python/3.7.3 Linux/4.9.184-linuxkit botocore/2.4.5dev10
  ```

------
#### [ Docker Hub ]

  ```
  $ docker run --rm -it amazon/aws-cli --version
  aws-cli/2.27.41 Python/3.7.3 Linux/4.9.184-linuxkit botocore/2.4.5dev10
  ```

------
+ `--rm` – 指定在命令退出后清理容器。
+ `-it` – 指定要使用 打开伪 TTY。`stdin`这允许您在容器中运行 AWS CLI 版本 2 时向其提供输入，例如，通过使用 `aws configure` 和 `aws help` 命令。当选择是否省略 `-it` 时，请考虑以下事项：
  + 如果您正在运行脚本，则不需要 `-it`。
  + 如果您的脚本遇到错误，则从 Docker 调用中省略 `-it` 也许能解决此问题。
  + 如果您正在尝试通过管道发送输出，`-it` 可能会导致错误，从 Docker 调用中省略 `-it` 也许能解决此问题。如果希望保留 `-it` 标志，但仍想通过管道发送输出，请禁用 AWS CLI 默认使用的[客户端分页程序](cli-usage-pagination.md#cli-usage-pagination-clientside)，应该能解决此问题。

有关 `docker run` 命令的更多信息，请参阅 [Docker 参考指南](https://docs.docker.com/engine/reference/run/)。

## 有关官方映像的接口和向后兼容性的说明
<a name="cliv2-docker-install-notes"></a>
+ 映像上支持的唯一工具是 AWS CLI。仅应直接运行 `aws` 可执行文件。例如，尽管已在映像上显式安装 `less` 和 `groff`，但它们不应直接在 AWS CLI 命令外部执行。
+ `/aws` 工作目录由用户控制。除非在运行 AWS CLI 命令时接到用户指示，否则映像不会写入此目录。
+ 依赖最新标签并不能保证向后兼容。为了确保向后兼容，您必须固定使用特定的 `<major.minor.patch>` 标签，因为这些标签是不可改变的；它们只会被推送一次。

## 使用特定版本和标签
<a name="cliv2-docker-upgrade"></a>

从版本 `2.0.6` 开始，官方 AWS CLI 版本 2 映像有多个版本可供使用。要运行 AWS CLI 版本 2 的特定版本，请将相应的标签附加到 `docker run` 命令。首次使用带有标签的 `docker run` 命令时，该标签的最新映像会下载到您的计算机。带有该标签的 `docker run` 命令的每次后续使用都从您的本地副本运行。

您可以使用两种类型的标签：
+ `latest` – 为映像定义 AWS CLI 版本 2 的最新版本。我们建议您在需要 AWS CLI 版本 2 的最新版本时使用 `latest` 标签。但是，依赖此标签时不保证向后兼容性。默认情况下，在 `latest` 命令中使用 `docker run` 标签。要显式使用 `latest` 标记，请将标签附加到容器映像名称。

------
#### [ Amazon ECR Public ]

  ```
  $ docker run --rm -it public.ecr.aws/aws-cli/aws-cli:latest command
  ```

------
#### [ Docker Hub ]

  ```
  $ docker run --rm -it amazon/aws-cli:latest command
  ```

------
+ `<major.minor.patch>` – 为映像定义 AWS CLI 版本 2 的特定版本。如果您计划在生产中使用官方映像，我们建议您使用 AWS CLI 版本 2 的特定版本，以确保向后兼容。例如，要运行版本 `2.0.6`，请将版本附加到容器映像名称中。

------
#### [ Amazon ECR Public ]

  ```
  $ docker run --rm -it public.ecr.aws/aws-cli/aws-cli:2.0.6 command
  ```

------
#### [ Docker Hub ]

  ```
  $ docker run --rm -it amazon/aws-cli:2.0.6 command
  ```

------

## 更新到最新的官方映像
<a name="cliv2-docker-update"></a>

由于最新的映像仅在您第一次使用 `docker run` 命令时下载到您的计算机，因此您需要手动提取更新的映像。要手动更新到最新版本，我们建议您拉取标记为 `latest` 的映像。拉取映像会将最新版本下载到您的计算机。

------
#### [ Amazon ECR Public ]

```
$ docker pull public.ecr.aws/aws-cli/aws-cli:latest
```

------
#### [ Docker Hub ]

```
$ docker pull amazon/aws-cli:latest
```

------

## 共享主机文件、凭据、环境变量和配置
<a name="cliv2-docker-share-files"></a>

由于 AWS CLI 版本 2 在容器中运行，因此，默认情况下 CLI 无法访问包括配置和凭证的主机文件系统。要将主机文件系统、凭证和配置共享到容器，请将主机系统的 `~/.aws` 目录挂载到位于 `/root/.aws` 的容器，并将 `-v` 标志附加到 `docker run` 命令。这允许在容器中运行的 AWS CLI 版本 2 查找主机文件信息。

------
#### [ Amazon ECR Public ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli command
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli command
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws  public.ecr.aws/aws-cli/aws-cli command
```

------
#### [ Docker Hub ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli command
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws amazon/aws-cli command
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws  amazon/aws-cli command
```

------

有关 `-v` 标志和挂载的更多信息，请参阅 [Docker 参考指南](https://docs.docker.com/storage/volumes/)。

**注意**  
有关 `config` 和 `credentials` 文件的信息，请参阅 [AWS CLI 中的配置和凭证文件设置](cli-configure-files.md)。

### 示例 1：提供凭证和配置
<a name="cliv2-docker-share-files-config"></a>

在此示例中，我们在运行 `s3 ls` 命令时提供主机凭证和配置，以便列出 Amazon Simple Storage Service (Amazon S3) 中的存储桶。以下示例使用 AWS CLI 凭证和配置文件的默认位置。要使用其他位置，请更改文件路径。

------
#### [ Amazon ECR Public ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws public.ecr.aws/aws-cli/aws-cli s3 ls
```

------
#### [ Docker Hub ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws amazon/aws-cli s3 ls
```

------

您可以使用 `-e` 标志调用特定系统的环境变量。要使用环境变量，请按名称调用它。

------
#### [ Amazon ECR Public ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws -e ENVVAR_NAME public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -e ENVVAR_NAME public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -e ENVVAR_NAME public.ecr.aws/aws-cli/aws-cli s3 ls
```

------
#### [ Docker Hub ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws -e ENVVAR_NAME amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -e ENVVAR_NAME amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -e ENVVAR_NAME amazon/aws-cli s3 ls
```

------

### 示例 2：将 Amazon S3 文件下载到您的主机系统
<a name="cliv2-docker-share-files-s3"></a>

对于某些 AWS CLI 版本 2 命令，您可以从容器中的主机系统读取文件，或将文件从容器写入主机系统。

在此示例中，我们通过将当前工作目录挂载到容器的 `S3` 目录，将 `s3://aws-cli-docker-demo/hello` 对象 `/aws` 下载到本地文件系统。通过将 `hello` 对象下载到容器的 `/aws` 目录，文件也会保存到主机系统的当前工作目录中。

------
#### [ Amazon ECR Public ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws public.ecr.aws/aws-cli/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
download: s3://aws-cli-docker-demo/hello to ./hello
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws public.ecr.aws/aws-cli/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
download: s3://aws-cli-docker-demo/hello to ./hello
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws public.ecr.aws/aws-cli/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
```

------
#### [ Docker Hub ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
download: s3://aws-cli-docker-demo/hello to ./hello
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws amazon/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
download: s3://aws-cli-docker-demo/hello to ./hello
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws amazon/aws-cli s3 cp s3://aws-cli-docker-demo/hello .
```

------

要确认本地文件系统中存在下载的文件，请运行以下命令。

**Linux 和 macOS**：

```
$ cat hello
Hello from Docker!
```

**Windows PowerShell**：

```
$ type hello
Hello from Docker!
```

### 示例 3：使用您的 AWS\$1PROFILE 环境变量
<a name="cliv2-docker-share-files-envvars"></a>

您可以使用 `-e` 标志调用特定系统的环境变量。调用您想使用的每个环境变量。在本示例中，我们在运行 `s3 ls` 命令以在 Amazon Simple Storage Service (Amazon S3) 中列出存储桶时提供了主机凭证、配置和 *AWS\$1PROFILE* 环境变量。

------
#### [ Amazon ECR Public ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws -e AWS_PROFILE public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -e AWS_PROFILE public.ecr.aws/aws-cli/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -e AWS_PROFILE public.ecr.aws/aws-cli/aws-cli s3 ls
```

------
#### [ Docker Hub ]

**Linux 和 macOS**：

```
$ docker run --rm -it -v ~/.aws:/root/.aws -e AWS_PROFILE amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows 命令提示符**

```
$ docker run --rm -it -v %userprofile%\.aws:/root/.aws -e AWS_PROFILE amazon/aws-cli s3 ls
2020-03-25 00:30:48 aws-cli-docker-demo
```

**Windows PowerShell**：

```
C:\> docker run --rm -it -v $env:userprofile\.aws:/root/.aws -e AWS_PROFILE amazon/aws-cli s3 ls
```

------

## 缩短 docker run 命令
<a name="cliv2-docker-aliases"></a>

为了缩短 `docker run` 命令，我们建议您使用操作系统的功能在 Linux 和 macOS 中创建 [https://www.linux.com/topic/desktop/understanding-linux-links/](https://www.linux.com/topic/desktop/understanding-linux-links/)（符号链接）或 [https://www.linux.com/topic/desktop/aliases-diy-shell-commands/](https://www.linux.com/topic/desktop/aliases-diy-shell-commands/)，或者在 Windows 中创建 [https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/doskey](https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/doskey)。要设置 `aws` 别名，可以运行以下命令之一。
+ 要对 `aws` 命令进行基本访问，请运行以下命令。

------
#### [ Amazon ECR Public ]

  **Linux 和 macOS**：

  ```
  $ alias aws='docker run --rm -it public.ecr.aws/aws-cli/aws-cli'
  ```

  **Windows 命令提示符**

  ```
  C:\> doskey aws=docker run --rm -it public.ecr.aws/aws-cli/aws-cli $*
  ```

  **Windows PowerShell**：

  ```
  C:\> Function AWSCLI {docker run --rm -it public.ecr.aws/aws-cli/aws-cli $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
#### [ Docker Hub ]

  **Linux 和 macOS**：

  ```
  $ alias aws='docker run --rm -it amazon/aws-cli'
  ```

  **Windows 命令提示符**

  ```
  C:\> doskey aws=docker run --rm -it amazon/aws-cli $*
  ```

  **Windows PowerShell**：

  ```
  C:\> Function AWSCLI {docker run --rm -it amazon/aws-cli $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
+ 要在使用 `aws` 命令时访问主机文件系统和配置设置，请运行以下命令：

------
#### [ Amazon ECR Public ]

  **Linux 和 macOS**：

  ```
  $ alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws public.ecr.aws/aws-cli/aws-cli'
  ```

  **Windows 命令提示符**

  ```
  C:\> doskey aws=docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws public.ecr.aws/aws-cli/aws-cli $*
  ```

  **Windows PowerShell**：

  ```
  C:\> Function AWSCLI {docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws public.ecr.aws/aws-cli/aws-cli $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
#### [ Docker Hub ]

  **Linux 和 macOS**：

  ```
  $ alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli'
  ```

  **Windows 命令提示符**

  ```
  C:\> doskey aws=docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws amazon/aws-cli $*
  ```

  **Windows PowerShell**：

  ```
  C:\> Function AWSCLI {docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws amazon/aws-cli $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
+ 要分配要在 `aws` 别名中使用的特定版本，请附加版本标签。

------
#### [ Amazon ECR Public ]

  **Linux 和 macOS**：

  ```
  $ alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws public.ecr.aws/aws-cli/aws-cli:2.0.6'
  ```

  **Windows 命令提示符**

  ```
  C:\> doskey aws=docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws public.ecr.aws/aws-cli/aws-cli:2.0.6 $*
  ```

  **Windows PowerShell**：

  ```
  C:\> Function AWSCLI {docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws public.ecr.aws/aws-cli/aws-cli:2.0.6 $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------
#### [ Docker Hub ]

  **Linux 和 macOS**：

  ```
  $ alias aws='docker run --rm -it -v ~/.aws:/root/.aws -v $(pwd):/aws amazon/aws-cli:2.0.6'
  ```

  **Windows 命令提示符**

  ```
  C:\> doskey aws=docker run --rm -it -v %userprofile%\.aws:/root/.aws -v %cd%:/aws amazon/aws-cli:2.0.6 $*
  ```

  **Windows PowerShell**：

  ```
  C:\> Function AWSCLI {docker run --rm -it -v $env:userprofile\.aws:/root/.aws -v $pwd\aws:/aws amazon/aws-cli:2.0.6 $args}
  Set-Alias -Name aws -Value AWSCLI
  ```

------

设置别名后，您可以从容器内运行 AWS CLI 版本 2，就好像它安装在主机系统上一样。

```
$ aws --version
aws-cli/2.27.41 Python/3.7.3 Linux/4.9.184-linuxkit botocore/2.4.5dev10
```