我有一个使用ioredis连接到redis并发布数据和其他内容的NodeJS应用程序。
我正在尝试编写一个针对redis的组件测试,并且能够通过jest创建一个setup/teardown脚本,该脚本通过docker在随机端口上运行redis,并在通过docker run -d -p 6379 --rm redis和docker stop {containerId}完成测试时将其销毁。
这在本地运行得很好,但我们在Dockerfile中的多阶段构建中运行了测试:RUN yarn test
我试着通过docker build .构建它,它运行得很好,直到它到达测试阶段,然后抱怨下面的错误- /bin/sh: docker: not found
因此,Docker不能用于docker-build过程来运行测试?
有没有办法运行docker-build,让它能够在进程中启动同级进程?
发布于 2020-06-02 01:03:30
在我看来,这就像是一种“对接”的情况。
你不能启动同级,但是你可以通过一些技巧在容器中产生一个容器:(你可能需要做一些googling才能得到正确的结果)
将docker二进制文件安装在"host container"
docker run -v /var/run/docker.sock:/var/run/docker.sock ...所示
但是您不能在构建步骤中做到这一点,因此对于您的情况来说,这并不容易。
我建议您准备一个能够运行嵌套容器的专用构建容器,它将基本上模拟您的本地环境并在您的CI中使用它。不过,您可能需要对流程进行一点重构,使其正常工作。
祝你好运:)
发布于 2020-06-02 03:31:52
在我的实践中,测试不应该关注初始化数据库,它们应该只关注如何连接到数据库,所以您只需通过环境变量传递数据库连接数据即可。
你这样做的方式它不会扩展,想象一下你的应用程序需要更多的服务,通过测试启动它们将是困难和不切实际的。
当您在本地进行开发时,您有责任在进行测试之前让服务运行。
您可以在存储库中使用docker编写脚本,这些脚本可以在您开始开发时创建和启动所需的所有服务。
当您在云中使用CI时,您仍然会使用docker容器并在其中运行测试(包含测试的节点容器、redis容器、mysql容器等)。同样,只需通过环境变量传递适当的连接数据。
https://stackoverflow.com/questions/62136981
复制相似问题