AWS CodeBuild:如何运行需要启动 Docker 的测试?

Sas*_*ota 6 javascript node.js docker aws-codebuild testcontainers

我有一个 Node.js 项目,其中包含Testcontainers,用于启动 Redis 和 Prostgress 进行测试。

我想将这些测试作为 CI 的一部分来运行。为此,我使用 Node.js 的 alpine 镜像,并在其上安装了 Docker。我可以运行不需要 Docker 的测试,但如果涉及 Docker,我会从 Testcontainers 收到此错误:

未找到 Docker 客户端策略

这是我在日志中得到的内容:

2022-05-25T13:09:11.494Z testcontainers DEBUG Found applicable Docker client strategy: UnixSocketStrategy
2022-05-25T13:09:11.531Z testcontainers DEBUG Testing Docker client strategy URI: unix:///var/run/docker.sock
2022-05-25T13:09:11.539Z testcontainers DEBUG No registry auth locator found for registry: "https://index.docker.io/v1/"
2022-05-25T13:09:11.543Z testcontainers WARN  Docker daemon is not reachable: Error: connect ENOENT /var/run/docker.sock
2022-05-25T13:09:11.543Z testcontainers WARN  Docker client strategy UnixSocketStrategy is not reachable
2022-05-25T13:09:11.544Z testcontainers ERROR Failed to list images: Error: No Docker client strategy found
2022-05-25T13:09:11.544Z testcontainers ERROR Failed to pull image "postgres:14.2-alpine": Error: No Docker client strategy found
Run Code Online (Sandbox Code Playgroud)

当我在本地启动测试时,测试运行良好。

我在 CodeBuild 文档中没有找到任何解释从构建器容器内部连接到 Docker 引擎的内容。我在 Testcontainers 文档中找到了这些说明,但我不明白如何在 AWS Codebuild 中应用这些说明。

问:如何在 AWS CodeBuild 中运行需要启动 Docker 的测试?

Erm*_*ary 3

警告 Docker 守护进程无法访问:错误:连接 ENOENT /var/run/docker.sock

默认情况下的 CodeBuild 环境:

  1. 无权与 Docker 守护进程交互,dockerd
  2. 没有运行 Docker 守护进程

该错误通过指出它无法到达守护程序来暗示这一点。

为了解决上述问题:

  1. 将构建规范版本设置为 0.2
  2. 运行您的构建并privilegedMode设置为true,以授予对守护进程的访问权限
  3. 确保守护进程正在运行

这里需要注意的关键点是,当使用 AWS CodeBuild 提供的官方 Docker 镜像时,Docker 守护进程通过dockerd-entrypoint.sh. 您不需要手动执行此操作。

然而,当使用自定义镜像时,您必须手动启动守护进程。


您可以在构建的安装阶段通过将以下命令添加到 buildspec.yml文件中来手动初始化 Docker 守护程序。

对于基于 Alpine 的图像:

version: 0.2

phases:
  install:
    commands:
      - nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2 &
      - timeout -t 15 sh -c "until docker info; do echo .; sleep 1; done"
...
Run Code Online (Sandbox Code Playgroud)

对于基于 Ubuntu 的映像:

version: 0.2

phases:
  install:
    commands:
      - nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2 &
      - timeout 15 sh -c "until docker info; do echo .; sleep 1; done"
...
Run Code Online (Sandbox Code Playgroud)

您现在应该能够在构建中运行 Docker 容器。

如果还是不行,那就和Testcontainers有关了。

根据您链接的文档,确保docker run ...运行容器的命令包含-v $PWD:$PWD -w $PWD -v /var/run/docker.sock:/var/run/docker.sock.