node.js - 从 npm 脚本运行 docker 不起作用

标签 node.js docker npm

我们有一个项目可以简化开发,它使用 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 - 类似当我执行硬编码路径时,情况如何。

app/package.json error

我查看了以下资源 - 但没有一个使用 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 还会以不同的方式将命令行参数传递给新进程。

进一步阅读:https://docgov.dev/posts/npm-scripts/

关于node.js - 从 npm 脚本运行 docker 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69182535/

相关文章:

javascript - 数据库搜索关键字的功能

javascript - 在不同的 Controller 文件中使用服务

java - 了解 tomcat docker 文件

npm - Electron 应用程序将无法运行。无法弄清楚为什么

javascript - 更改特定于项目的node_modules路径

node.js - 如何模拟从 fs.readFile 返回的错误以进行测试?

json - Node : jade table - with Dynamic json from controller

python - 两个 Docker 容器之间的通信

docker - 如何使用Curl从Jenkins通过Docker网桥将文件发布到Go服务器?

node.js - 如何在 nodejs 的 promise 中完成执行?