【问题标题】:Running docker from npm script not working从 npm 脚本运行 docker 不起作用
【发布时间】:2021-09-15 03:39:28
【问题描述】:

我们有一个项目来简化开发,它使用 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",
  },
}

理想情况下,我们最终将拥有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-push/:/app 进行硬编码时。理想情况下,这不会是硬编码的,但是当我使用 $(pwd) 时,我会收到错误,它现在找不到我的 package.json .. 这是它使用 $(pwd) 而不是硬编码路径 - 它试图查看工作目录/app 路径 - 但是 workdir 是应用程序,它应该在安装应用程序的位置寻找 package.json - 类似于我执行硬编码路径时的情况。

我查看了以下资源 - 但没有一个使用 npm

【问题讨论】:

  • 您似乎正在从 Windows 运行 npm。 Windows 的默认 shell(也将是从 npm 调用时评估脚本的内容 - 无论您用于启动 npm 的 shell)是 cmd 而不是 bash,并且 cmd 不使用 $() 语法。请改用%cd%
  • @CherryDT 哇,就是这样。我做了一个巨大的假设,即从不同的 shell 运行 npm,它在该上下文和该 shell 中运行。将那段代码更新为 -v %cd% :/app 效果很好!
  • 很高兴听到。将其扩展为答案。
  • bats this npm package?只要您在package.json 文件中的devDependencies 中列出了它,npm run test 应该可以正常工作,开发人员无需手动进行额外安装,也无需处理 Docker 的复杂性。

标签: node.js docker npm


【解决方案1】:

TL;DR

$(pwd) 替换为%cd%

说明

您似乎正在从 Windows 运行 npm。这里有一个陷阱:即使你使用 Git Bash(或任何你喜欢的 shell),npm 生成的子 shell 也不一定使用相同的 shell - 它们将使用默认 shell(在 Windows 中它由 @987654324 指定@ 环境变量)。在 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/

【讨论】:

    猜你喜欢
    • 2018-12-21
    • 2016-04-01
    • 2017-04-21
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2021-01-04
    • 2018-02-15
    • 2013-01-21
    相关资源
    最近更新 更多