Docker 构建找不到 docker 来运行测试



我有一个 NodeJS 应用程序,它使用ioredis连接到 redis 并发布数据和其他 redisy 内容。

我正在尝试针对 redis 编写一个组件测试,并且能够通过开玩笑创建一个设置/拆卸脚本,该脚本通过随机端口上的 docker 运行 redis,并在通过docker run -d -p 6379 --rm redisdocker stop {containerId}完成测试时将其拆除。

这在本地效果很好,但我们在 Dockerfile 中的多阶段构建中运行了测试:RUN yarn test

我尝试通过docker build .构建它一直很好,直到它进入测试,然后抱怨以下错误 -/bin/sh: docker: not found

因此,Docker对docker构建过程不可用以运行测试?

有没有办法运行docker-build,使其能够在此过程中启动同级进程?

这对我来说闻起来像是"docker-in-docker"的情况。

你不能旋转兄弟姐妹,但你可以通过做一些技巧在容器内生成一个容器:(你可能需要做一些谷歌搜索才能正确(

  • 在"主机容器"中安装 Docker 二进制文件
  • docker 套接字从实际主机挂载到"主机"容器内,就像 sodocker run -v /var/run/docker.sock:/var/run/docker.sock ...

但是您将无法在构建步骤中做到这一点,因此对于您的情况来说并不容易。

我建议你准备一个能够运行嵌套容器的专用构建容器,它基本上可以模拟你的本地环境并在你的CI中使用它。不过,您可能需要稍微重构您的流程才能使其正常工作。

祝你好运:)

在我的实践中,测试不应该关注初始化数据库,它们应该只关注如何连接到数据库,所以你只需通过环境变量传递数据库连接数据。

你这样做的方式不会扩展,想象一下你的应用程序需要更多的服务,通过测试启动它们将是困难和不切实际的。

在本地开发时,您有责任在执行测试之前运行服务。

您可以让 docker 在存储库中编写脚本,这些脚本会在您开始开发时创建并启动您需要的所有服务。

当你在云中使用CI时,你仍然会使用docker容器并在其中运行测试(节点容器与你的测试,redis容器,mysql容器等(,并再次通过环境变量传递适当的连接数据。