我们有一个项目可以简化开发,它使用 Node 来处理一些依赖项以及我们的测试脚本来启动 docker 镜像以运行测试。目标是开发人员无需在本地运行 bats
,只需运行 npm test
即可启动图像并运行测试。
我可以通过多种方式在我的 Git Bash 中让它在本地工作 - 但是我无法通过 npm 脚本让它工作 - 这导致我现在一两天都在发送不同的 SO 方法来尝试和解决。这是我正在处理的内容:
{
"scripts": {
"test": "bats test/**/*.bats",
"test-ci": "bats --formatter junit -T test/**/*.bats",
"test-docker": "docker run -it -v /c/source/git/devops/dotnetcore-nuget-push/:/app node:slim npm test",
"test-docker-test": "docker run -it -v $(pwd):/app -w //app node:slim npm test",
"test-docker-debug": "docker run -it -v /c/source/git/devops/dotnetcore-nuget-push:/app -w //app node:slim bash -c \"echo $(pwd) && ls\"",
"test-docker2": "docker run -it -v /c/source/git/devops/dotnetcore-nuget-push/:/app -w //app node:slim npm test",
},
}
理想情况下,我们最后会进行测试
- 只是尝试一些事情来确保它们工作相同。
以下是在 Git Bash 中本地运行的内容:
docker run -it -v/$(pwd):/app -w//app node:slim npm test
docker run -it -v/$(pwd):/$(pwd) -w/$(pwd) node:slim npm test
MSYS_NO_PATHCONV=1 docker run -it -v $(pwd):$(pwd) -w $(pwd) node:slim npm test
所以我尝试将其中一些和一个调试脚本添加到我的 npm 脚本中,但唯一可行的是当我对卷路径进行硬编码时 -v/c/source/git/devops/dotnetcore-nuget -推/:/应用程序
。理想情况下,这不会被硬编码,但是当我使用 $(pwd)
时,我得到错误,它现在找不到我的 package.json ..这是使用 $(pwd)
而不是硬编码路径 - 它尝试查看 workdir/app 路径 - 但是 workdir 是应用程序,它应该在安装应用程序的地方寻找 package.json
- 类似当我执行硬编码路径时,情况如何。
我查看了以下资源 - 但没有一个使用 npm
最佳答案
长话短说
将 $(pwd)
替换为 %cd%
。
说明
看来您正在从 Windows 运行 npm。这里有一个陷阱:即使您使用 Git Bash(或任何您喜欢的 shell),npm 生成的子 shell 也不一定使用相同的 shell - 它们将使用默认 shell(在 Windows 中,它由 COMSPEC
环境变量)。在 Linux 环境中通常是 bash
,但在 Windows 中它是 cmd.exe
而不是 Git Bash! cmd.exe
不知道如何处理命令行中的 $(pwd)
并将其逐字转发给 docker
。
这意味着如果您打算跨平台使用它们,package.json
中的脚本不能使用特定于 shell 的功能。对于更复杂的操作,通常最简单的方法是使用 node .scripts/someScript.js
等,并以与平台无关的方式在 JavaScript 文件中提供实际逻辑。
如果在 Windows 下仅正确运行的脚本足以满足您的需求,那么您可以使用 %cd%
而不是 $(pwd )
(引用当前工作目录的cmd方式)。不过,最好将整个参数放在双引号中,因为 cmd 还会以不同的方式将命令行参数传递给新进程。
关于node.js - 从 npm 脚本运行 docker 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69182535/