

终止支持通知：2026 年 10 月 7 日， AWS 将停止对的支持。 AWS IoT Greengrass Version 1 2026 年 10 月 7 日之后，您将无法再访问这些 AWS IoT Greengrass V1 资源。如需了解更多信息，请访问[迁移自 AWS IoT Greengrass Version 1](https://docs.aws.amazon.com/greengrass/v2/developerguide/migrate-from-v1.html)。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# AWS IoT Greengrass 在 Docker 容器中运行
<a name="run-gg-in-docker-container"></a>

AWS IoT Greengrass 可以配置为在 [Docker](https://www.docker.com/) 容器中运行。

您可以通过[亚马逊](what-is-gg.md#gg-docker-download)下载安装了 AWS IoT Greengrass 核心软件和依赖项 CloudFront的 Dockerfile。要修改 Docker 镜像以便在不同平台架构上运行或减少 Docker 镜像的大小，请参阅 Docker 程序包下载中的 `README` 文件。

为了帮助您开始试验 AWS IoT Greengrass， AWS 还提供了安装了 C AWS IoT Greengrass ore 软件和依赖项的预构建 Docker 镜像。您可以从 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) 或 [Amazon Elastic Container Registry](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html) (Amazon ECR) 下载映像。这些预先构建的映像使用亚马逊 Linux 2 (x86\$164) 和 Alpine Linux（x86\$164、armv7L 或）基础映像。 AArch64

**重要**  
<a name="docker-images-end-of-maintenance"></a>2022 年 6 月 30 日，我 AWS IoT Greengrass 结束了对发布到亚马逊弹性容器注册表 (Amazon ECR) 和 Docker Hub 的 AWS IoT Greengrass 核心软件 v1.x Docker 镜像的维护。您可以继续从 Amazon ECR 和 Docker Hub 下载这些 Docker 映像，直至 2023 年 6 月 30（即维护结束 1 年后）为止。但是，在 2022 年 6 月 30 日维护结束后， AWS IoT Greengrass 核心软件 v1.x Docker 镜像不再收到安全补丁或错误修复。如果您运行的生产工作负载依赖于这些 Docker 镜像，我们建议您使用提供的 Dockerfiles 构建自己的 Docker 镜像。 AWS IoT Greengrass 有关更多信息，请参阅 [AWS IoT Greengrass Docker 软件](what-is-gg.md#gg-docker-download)。

本主题介绍如何从亚马逊 ECR 下载 AWS IoT Greengrass Docker 镜像并在 Windows、macOS 或 Linux (x86\$164) 平台上运行该镜像。本主题包含以下步骤：

1. [从 Amazon ECR 获取 AWS IoT Greengrass 容器镜像](#docker-pull-image)

1. [创建和配置 Greengrass 组和核心](#docker-config-gg)

1. [在 AWS IoT Greengrass 本地运行](#docker-run-gg)

1. [为组配置“No container (无容器)”容器化](#docker-no-container)

1. [将 Lambda 函数部署到 Docker 容器](#docker-add-lambdas)

1. [（可选）部署与 Docker 容器中的 Greengrass 交互的客户端设备](#docker-add-devices)

在 Docker 容器 AWS IoT Greengrass 中运行时，不支持以下功能：<a name="docker-image-unsupported-features"></a>
+ 在 **Greengrass 容器模式**下运行的[连接器](connectors.md)。要在 Docker 容器中运行连接器，该连接器必须在**无容器**模式下运行。要查找支持**无容器**模式的连接器，请参阅[AWS提供的 Greengrass 连接器](connectors-list.md)。其中一些连接器具有隔离模式参数，您必须将此参数设为**无容器**。
+ [本地设备和卷资源](access-local-resources.md)。在 Docker 容器中运行的用户定义 Lambda 函数必须直接访问核心上的设备和卷。

当 Greengrass 组的 Lambda 运行时环境设置为 “无容器”（在 Docker [容器中运行是必需的）时，不](lambda-group-config.md#no-container-mode)支持这些功能。 AWS IoT Greengrass 

## 先决条件
<a name="docker-image-prerequisites"></a>

在开始本教程之前，必须执行以下操作。<a name="docker-image-prereq-list"></a>
+ 您必须根据所选的 AWS Command Line Interface (AWS CLI) 版本在主机上安装以下软件和版本。

------
#### [ AWS CLI version 2 ]
  + [Docker](https://docs.docker.com/install/) 版本 18.09 或更高版本。早期版本也可能有效，但我们建议使用 18.09 或更高版本。
  + AWS CLI 版本 2.0.0 或更高版本。
    + 要安装 AWS CLI 版本 2，请参阅[安装 AWS CLI 版本 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)。
    + 要配置 AWS CLI，请参阅[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。
**注意**  
要在 Windows 计算机上升级到更高 AWS CLI 版本 2，必须重复 [MSI 安装](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-windows.html)过程。

------
#### [ AWS CLI version 1 ]
  + [Docker](https://docs.docker.com/install/) 版本 18.09 或更高版本。早期版本也可能有效，但我们建议使用 18.09 或更高版本。
  + [Python](https://www.python.org/downloads/) 版本 3.6 或更高版本。
  + [pip](https://pip.pypa.io/en/stable/installing) 版本 18.1 或更高版本。
  + AWS CLI 版本 1.17.10 或更高版本
    + 要安装 AWS CLI 版本 1，请参阅[安装 AWS CLI 版本 1](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html)。
    + 要配置 AWS CLI，请参阅[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。
    + 要升级到版本 1 的最新 AWS CLI 版本，请运行以下命令。

      ```
      pip install awscli --upgrade --user
      ```
**注意**  
如果你在 Windows 上使用 [MSI 安装](https://docs.aws.amazon.com/cli/latest/userguide/install-windows.html#msi-on-windows) AWS CLI 版本 1，请注意以下几点：  
如果 AWS CLI 版本 1 安装无法安装 botocore，请尝试使用 Pyth [on 和 pip](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html#awscli-install-windows-pip) 安装。
要升级到更高 AWS CLI 版本 1，必须重复 MSI 安装过程。

------
+ 要访问 Amazon Elastic Container Registry (Amazon ECR) 资源，您必须授予以下权限。
  + Amazon ECR 要求用户通过 AWS Identity and Access Management (IAM) 策略授予`ecr:GetAuthorizationToken`权限，然后才能向注册表进行身份验证以及从 Amazon ECR 存储库推送或拉取映像。有关更多信息，请参阅 *Amazon Elastic Container Registry 用户指南*中的 [Amazon ECR 存储库策略示例](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html)和[访问一个 Amazon ECR 存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html#security_iam_id-based-policy-examples-access-one-bucket)。

## 第 1 步：从 Amazon ECR 获取 AWS IoT Greengrass 容器镜像
<a name="docker-pull-image"></a>

AWS 提供安装了 AWS IoT Greengrass 核心软件的 Docker 镜像。

**警告**  <a name="docker-images-python-2.7-removal"></a>
从 AWS IoT Greengrass 核心软件的 v1.11.6 开始，Greengrass Docker 镜像不再包含 Python 2.7，因为 Python 2.7 已于 2020 年推出，不再接收安全更新。 end-of-life如果您选择更新这些 Docker 映像，我们建议您在将更新部署到生产设备之前，先验证应用程序是否可以使用新的 Docker 映像。如果使用 Greengrass Docker 映像的应用程序需要 Python 2.7，您可以修改 Greengrass Dockerfile，为您的应用程序包含 Python 2.7。

有关演示如何从 Amazon ECR 拉取 `latest` 映像的步骤，请选择您的操作系统：

### 拉取容器镜像 (Linux)
<a name="docker-pull-image-linux"></a>

在计算机终端中运行以下命令。

1. <a name="docker-get-login"></a>在 Amazon ECR 中登录 AWS IoT Greengrass 注册表。

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

   如果成功，输出将打印 `Login Succeeded`。

1. <a name="docker-docker-pull"></a>检索 AWS IoT Greengrass 容器镜像。

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**注意**  
该`latest`镜像包含安装在 Amazon Linux 2 基础映像上的 AWS IoT Greengrass 核心软件的最新稳定版本。您还可以从存储库中拉取其他版本。要查找所有可用映像的标签，请查看 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) 上的 **标签**页面或使用 **aws ecr list-images** 命令。例如：  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

1. 启用符号链接和硬链接保护。如果您正在尝试在容器 AWS IoT Greengrass 中运行，则只能启用当前启动的设置。
**注意**  
您可能需要使用 **sudo** 才能运行这些命令。
   + 要仅启用当前引导的设置，请执行以下操作：

     ```
     echo 1 > /proc/sys/fs/protected_hardlinks
     echo 1 > /proc/sys/fs/protected_symlinks
     ```
   + 要使设置在重新启动后保持不变，请执行以下操作：

     ```
     echo '# AWS IoT Greengrass' >> /etc/sysctl.conf 
     echo 'fs.protected_hardlinks = 1' >> /etc/sysctl.conf 
     echo 'fs.protected_symlinks = 1' >> /etc/sysctl.conf
     
     sysctl -p
     ```

1. <a name="docker-linux-enable-ipv4"></a>启用 IPv4 网络转发，这是在 Linux 上 AWS IoT Greengrass 运行云部署和 MQTT 通信所必需的。在 `/etc/sysctl.conf` 文件中，将 `net.ipv4.ip_forward` 设置为 1，然后重新加载 `sysctls`。

   ```
   sudo nano /etc/sysctl.conf
   # set this net.ipv4.ip_forward = 1
   sudo sysctl -p
   ```
**注意**  
您可以使用您选择的编辑器而不是 nano。

### 拉取容器镜像 (macOS)
<a name="docker-pull-image-mac"></a>

在计算机终端中运行以下命令。

1. <a name="docker-get-login"></a>在 Amazon ECR 中登录 AWS IoT Greengrass 注册表。

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

   如果成功，输出将打印 `Login Succeeded`。

1. <a name="docker-docker-pull"></a>检索 AWS IoT Greengrass 容器镜像。

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**注意**  
该`latest`镜像包含安装在 Amazon Linux 2 基础映像上的 AWS IoT Greengrass 核心软件的最新稳定版本。您还可以从存储库中拉取其他版本。要查找所有可用映像的标签，请查看 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) 上的 **标签**页面或使用 **aws ecr list-images** 命令。例如：  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

### 拉取容器镜像 (Windows)
<a name="docker-pull-image-windows"></a>

在命令提示符中运行以下命令。Docker 桌面必须先处于运行状态，然后您才能在 Windows 上使用 Docker 命令。

1. <a name="docker-get-login"></a>在 Amazon ECR 中登录 AWS IoT Greengrass 注册表。

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

   如果成功，输出将打印 `Login Succeeded`。

1. <a name="docker-docker-pull"></a>检索 AWS IoT Greengrass 容器镜像。

   ```
   docker pull 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```
**注意**  
该`latest`镜像包含安装在 Amazon Linux 2 基础映像上的 AWS IoT Greengrass 核心软件的最新稳定版本。您还可以从存储库中拉取其他版本。要查找所有可用映像的标签，请查看 [Docker Hub](https://hub.docker.com/r/amazon/aws-iot-greengrass) 上的 **标签**页面或使用 **aws ecr list-images** 命令。例如：  

   ```
   aws ecr list-images --region us-west-2 --registry-id 216483018798 --repository-name aws-iot-greengrass
   ```

## 步骤 2：创建和配置 Greengrass 组和核心
<a name="docker-config-gg"></a>

Docker 镜像安装了 AWS IoT Greengrass 核心软件，但你必须创建 Greengrass 组和内核。这包括下载证书和核心配置文件。
+ 按照 [模块 2：安装 AWS IoT Greengrass 核心软件](module2.md) 中的步骤操作。跳过下载和运行 AWS IoT Greengrass Core 软件的步骤。Docker 镜像中已设置软件及其运行时依赖项。

## 步骤 3： AWS IoT Greengrass 在本地运行
<a name="docker-run-gg"></a>

配置您的组后，便能配置和启动核心。有关演示如何执行此操作的步骤，请选择您的操作系统：

### 本地运行 Greengrass (Linux)
<a name="docker-run-gg-linux"></a>

在计算机终端中运行以下命令。

1. <a name="docker-create-certs-folder"></a>为设备的安全资源创建一个文件夹，然后将证书和密钥移入该文件夹中。运行以下命令。*path-to-security-files*替换为安全资源的路径，并*certificateId*替换为文件名中的证书 ID。

   ```
   mkdir /tmp/certs
   mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs
   mv path-to-security-files/certificateId-public.pem.key /tmp/certs
   mv path-to-security-files/certificateId-private.pem.key /tmp/certs
   mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
   ```

1. <a name="docker-create-config-folder"></a>为设备配置创建一个文件夹，然后将 AWS IoT Greengrass Core 配置文件移至该文件夹。运行以下命令。*path-to-config-file*替换为配置文件的路径。

   ```
   mkdir /tmp/config
   mv path-to-config-file/config.json /tmp/config
   ```

1. <a name="docker-docker-run"></a>在 Docker 容器中启动 AWS IoT Greengrass 并绑定挂载证书和配置文件。

   将 `/tmp` 替换为您解压证书和配置文件的路径。

   ```
   docker run --rm --init -it --name aws-iot-greengrass \
   --entrypoint /greengrass-entrypoint.sh \
   -v /tmp/certs:/greengrass/certs \
   -v /tmp/config:/greengrass/config \
   -p 8883:8883 \
   216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   输出应类似于此示例：

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

### 本地运行 Greengrass (macOS)
<a name="docker-run-gg-mac"></a>

在计算机终端中运行以下命令。

1. <a name="docker-create-certs-folder"></a>为设备的安全资源创建一个文件夹，然后将证书和密钥移入该文件夹中。运行以下命令。*path-to-security-files*替换为安全资源的路径，并*certificateId*替换为文件名中的证书 ID。

   ```
   mkdir /tmp/certs
   mv path-to-security-files/certificateId-certificate.pem.crt /tmp/certs
   mv path-to-security-files/certificateId-public.pem.key /tmp/certs
   mv path-to-security-files/certificateId-private.pem.key /tmp/certs
   mv path-to-security-files/AmazonRootCA1.pem /tmp/certs
   ```

1. <a name="docker-create-config-folder"></a>为设备配置创建一个文件夹，然后将 AWS IoT Greengrass Core 配置文件移至该文件夹。运行以下命令。*path-to-config-file*替换为配置文件的路径。

   ```
   mkdir /tmp/config
   mv path-to-config-file/config.json /tmp/config
   ```

1. <a name="docker-docker-run"></a>在 Docker 容器中启动 AWS IoT Greengrass 并绑定挂载证书和配置文件。

   将 `/tmp` 替换为您解压证书和配置文件的路径。

   ```
   docker run --rm --init -it --name aws-iot-greengrass \
   --entrypoint /greengrass-entrypoint.sh \
   -v /tmp/certs:/greengrass/certs \
   -v /tmp/config:/greengrass/config \
   -p 8883:8883 \
   216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   输出应类似于此示例：

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

### 本地运行 Greengrass (Windows)
<a name="docker-run-gg-windows"></a>

1. 为设备的安全资源创建一个文件夹，然后将证书和密钥移入该文件夹中。在命令提示符中运行以下命令。*path-to-security-files*替换为安全资源的路径，并*certificateId*替换为文件名中的证书 ID。

   ```
   mkdir C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-certificate.pem.crt C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-public.pem.key C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\certificateId-private.pem.key C:\Users\%USERNAME%\Downloads\certs
   move path-to-security-files\AmazonRootCA1.pem C:\Users\%USERNAME%\Downloads\certs
   ```

1. 为设备配置创建一个文件夹，然后将 AWS IoT Greengrass Core 配置文件移至该文件夹。在命令提示符中运行以下命令。*path-to-config-file*替换为配置文件的路径。

   ```
   mkdir C:\Users\%USERNAME%\Downloads\config
   move path-to-config-file\config.json C:\Users\%USERNAME%\Downloads\config
   ```

1. 在 Docker 容器中启动 AWS IoT Greengrass 并绑定挂载证书和配置文件。在命令提示符处运行以下命令。

   ```
   docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
   ```

   当 Docker 提示您与 Docker 守护程序共享 `C:\` 驱动器时，允许它在 Docker 容器内绑定挂载 `C:\` 目录。有关更多信息，请参阅 Docker 文档中的[共享驱动器](https://docs.docker.com/docker-for-windows/#shared-drives)。

   输出应类似于此示例：

   ```
   Setting up greengrass daemon
   Validating hardlink/softlink protection
   Waiting for up to 30s for Daemon to start
   
   Greengrass successfully started with PID: 10
   ```

**注意**  
如果容器不打开 shell 并立即退出，则可以在启动映像时通过绑定挂载 Greengrass 运行时日志来调试问题。有关更多信息，请参阅 [在 Docker 容器之外保留 Greengrass 运行时日志](#debugging-docker-persist-logs)。

## 步骤 4：为 Greengrass 组配置“No container (无容器)”容器化
<a name="docker-no-container"></a>

在 Docker 容器 AWS IoT Greengrass 中运行时，所有 Lambda 函数都必须在不进行容器化的情况下运行。在此步骤中，将组的默认容器化设置为 **No container (无容器)**。在首次部署组之前，您必须执行此操作。

1. <a name="console-gg-groups"></a>**在 AWS IoT 控制台导航窗格的**管理**下，展开 **Greengrass** 设备，然后选择群组 (V1)。**

1. <a name="group-choose-group"></a>选择要更改其设置的组。

1. 选择 **Lambda 函数**选项卡。

1. 在**默认 Lambda 函数运行时环境**下，选择**编辑**。

1. 在**编辑默认 Lambda 函数运行时环境**中，更改 **Lambda 函数容器化**下的容器化设置。

1. 选择**保存**。

这些更改将在部署组时生效。

有关更多信息，请参阅 [在组中设置 Lambda 函数的默认容器化](lambda-group-config.md#lambda-containerization-groupsettings)。

**注意**  
默认情况下，Lambda 函数使用组容器化设置。当 AWS IoT Greengrass 在 Docker 容器中运行时，如果您覆盖任何 Lambda 函数的**无容器**设置，则部署将失败。

## 第 5 步：将 Lambda 函数部署到 Docker 容器 AWS IoT Greengrass
<a name="docker-add-lambdas"></a>

您可以将长期存在的 Lambda 函数部署到 Greengrass Docker 容器。
+ 执行 [模块 3（第 1 部分）：开启 Lambda 函数 AWS IoT Greengrass](module3-I.md) 中的步骤以将长期存在的 Hello World Lambda 函数部署到容器。

## 步骤 6：（可选）部署与 Docker 容器中运行的 Greengrass 交互的客户端设备
<a name="docker-add-devices"></a>

您还可以部署在 Docker 容器中运行 AWS IoT Greengrass 时与之交互的客户端设备。
+ 执行 [模块 4：与 AWS IoT Greengrass 群组中的客户端设备交互](module4.md) 中的步骤以部署连接到核心并发送 MQTT 消息的客户端设备。

## 停止 AWS IoT Greengrass Docker 容器
<a name="docker-stop"></a>

要停止 AWS IoT Greengrass Docker 容器，请在终端或命令提示符下按 Ctrl\$1C。此操作将向 Greengrass 守护程序进程发送 `SIGTERM` 以停用 Greengrass 守护程序进程及其启动的所有 Lambda 进程。Docker 容器通过 `/dev/init` 进程初始化为 PID 1，这有助于删除任何剩余的僵尸进程。有关更多信息，请参阅 [Docker 运行参考](https://docs.docker.com/engine/reference/commandline/run/#options)。

## 在 Docker AWS IoT Greengrass 容器中进行故障排除
<a name="troubleshooting-docker-gg"></a>

使用以下信息来帮助解决在 Docker 容器 AWS IoT Greengrass 中运行的问题。

### 错误：无法从非 TTY 设备执行交互式登录。
<a name="docker-troubleshootin-ecr-get-login-password"></a>

**解决方案：**运行 `aws ecr get-login-password` 命令时，可能会出现此错误。确保您已安装最新的 AWS CLI 版本 2 或版本 1。我们建议您使用 AWS CLI 版本 2。有关更多信息，请参阅《AWS Command Line Interface 用户指南》**中的[安装 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。

### 错误：未知选项：-no-include-email。
<a name="docker-troubleshooting-cli-version"></a>

**解决方案：**运行 `aws ecr get-login` 命令时，可能会出现此错误。确保安装了最新 AWS CLI 版本（例如，运行:`pip install awscli --upgrade --user`）。如果您使用的是 Windows，并且您已使用 MSI 安装程序安装 CLI，则必须重复安装过程。有关更多信息，请参阅*AWS Command Line Interface 用户指南*中的[在 Microsoft Windows 上安装 AWS Command Line Interface](https://docs.aws.amazon.com/cli/latest/userguide/awscli-install-windows.html)。

### 警告： IPv4 已禁用。网络将不起作用。
<a name="docker-troubleshooting-ipv4-disabled"></a>

**解决方案：**在 Linux 计算机 AWS IoT Greengrass 上运行时，您可能会收到此警告或类似消息。按照本[步骤](#docker-linux-enable-ipv4)中的说明启用 IPv4 网络转发。 AWS IoT Greengrass 未启用 IPv4 转发功能时，云部署和 MQTT 通信不起作用。有关更多信息，请参阅 Docker 文档中的[在运行时配置具有命名空间的内核参数 (sysctls)](https://docs.docker.com/engine/reference/commandline/run/#configure-namespaced-kernel-parameters-sysctls-at-runtime)。

### 错误：防火墙阻止 Windows 和容器之间的文件共享。
<a name="docker-troubleshooting-firewall"></a>

**解决方案：**在 Windows 计算机上运行 Docker 时，您可能会收到此错误或 `Firewall Detected` 消息。如果您登录虚拟私有网络 (VPN) 并且网络设置阻止挂载共享驱动器，也会出现此错误。在这种情况下，请关闭 VPN 并重新运行 Docker 容器。

### 错误：调用 GetAuthorizationToken 操作时出现错误 (AccessDeniedException)：用户：arn: aws: iam::: user/ <account-id><user-name>无权在资源上执行:ecr:: GetAuthorizationToken
<a name="docker-troubleshooting-ecr-perms"></a>

如果您没有足够权限来访问 Amazon ECR 存储库，则运行 `aws ecr get-login-password` 命令时可能会收到此错误。有关更多信息，请参阅*Amazon ECR 用户指南*中的 [Amazon ECR 存储库策略示例](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-policy-examples.html)和[访问 One Amazon ECR 存储库](https://docs.aws.amazon.com/AmazonECR/latest/userguide/security_iam_id-based-policy-examples.html)。

有关一般 AWS IoT Greengrass 故障排除帮助，请参阅[故障排除 AWS IoT Greengrass](gg-troubleshooting.md)。

### AWS IoT Greengrass 在 Docker 容器中进行调试
<a name="debugging-docker-gg"></a>

要调试 Docker 容器的问题，您可以保留 Greengrass 运行时日志或将交互式 shell 附加到 Docker 容器。

#### 在 Docker 容器之外保留 Greengrass 运行时日志
<a name="debugging-docker-persist-logs"></a>

您可以在绑定挂载目录后运行 AWS IoT Greengrass Docker 容器。`/greengrass/ggc/var/log`即使容器退出或被删除，日志仍然存在。

**在 Linux 或 macOS 上**  
[停止任何在主机上运行的 Greengrass Docker 容器](#docker-stop)，然后在终端中运行以下命令。这会绑定挂载 Greengrass `log` 目录并启动 Docker 镜像。  
将 `/tmp` 替换为您解压证书和配置文件的路径。  

```
docker run --rm --init -it --name aws-iot-greengrass \
      --entrypoint /greengrass-entrypoint.sh \
      -v /tmp/certs:/greengrass/certs \
      -v /tmp/config:/greengrass/config \
      -v /tmp/log:/greengrass/ggc/var/log \
      -p 8883:8883 \
      216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
```
然后，您可以在主机上的 `/tmp/log` 中检查日志，以查看 Greengrass 在 Docker 容器内运行时发生的情况。

**在 Windows 上**  
[停止任何在主机上运行的 Greengrass Docker 容器](#docker-stop)，然后在命令提示符中运行以下命令。这会绑定挂载 Greengrass `log` 目录并启动 Docker 镜像。  

```
cd C:\Users\%USERNAME%\Downloads
mkdir log
docker run --rm --init -it --name aws-iot-greengrass --entrypoint /greengrass-entrypoint.sh -v c:/Users/%USERNAME%/Downloads/certs:/greengrass/certs -v c:/Users/%USERNAME%/Downloads/config:/greengrass/config -v c:/Users/%USERNAME%/Downloads/log:/greengrass/ggc/var/log -p 8883:8883 216483018798.dkr.ecr.us-west-2.amazonaws.com/aws-iot-greengrass:latest
```
然后，您可以在主机上的 `C:/Users/%USERNAME%/Downloads/log` 中检查日志，以查看 Greengrass 在 Docker 容器内运行时发生的情况。

#### 将交互式 Shell 附加到 Docker 容器
<a name="debugging-docker-attach-shell"></a>

您可以将交互式外壳附加到正在运行的 AWS IoT Greengrass Docker 容器上。这可以帮助您调查 Greengrass Docker 容器的状态。

**在 Linux 或 macOS 上**  
当 Greengrass Docker 容器正在运行时，在单独的终端中运行以下命令。  

```
docker exec -it $(docker ps -a -q -f "name=aws-iot-greengrass") /bin/bash
```

**在 Windows 上**  
当 Greengrass Docker 容器正在运行时，在单独的命令提示符中运行以下命令。  

```
docker ps -a -q -f "name=aws-iot-greengrass"
```
*gg-container-id*替换为上一个命令的`container_id`结果。  

```
docker exec -it gg-container-id /bin/bash
```