Dockerizing Node.js 应用程序 - 有什么作用:ENV PATH /app/node_modules/.bin:$PATH

jea*_*rme 5 node.js docker

我经历了为数不多的很好的 dockerizing Vue.js 教程之一,有一件事我不明白为什么是强制性的Dockerfile

# add `/app/node_modules/.bin` to $PATH
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json /usr/src/app/package.json #not sure though how it relates to PATH...
Run Code Online (Sandbox Code Playgroud)

我在这里只找到了一种解释它说:

我们将所有 Node.js 二进制文件暴露给我们的 PATH 环境变量,并将我们的项目 package.json 复制到 app 目录。复制 JSON 文件而不是整个工作目录允许我们利用 Docker 的缓存层。

尽管如此,它并没有让我变得更聪明。谁能用简单的英语解释一下?

win*_*rrr 7

错误预防

我认为这只是防止 Docker 无法找到正确的可执行文件(或根本没有任何可执行文件)的错误的简单方法。除了在图像中添加另一层之外,据我所知,将该行添加到您的Dockerfile.

它是如何工作的?

添加node_modules/binPATH环境变量可确保可以找到在npm build或进程期间创建的可执行文件。yarn build您还可以将COPY本地构建的node_modules文件夹添加到映像中,但建议将其构建在 Docker 容器内,以确保所有二进制文件都适应容器中运行的底层操作系统。最佳实践是使用多阶段构建

node_modules/bin此外,在环境变量的开头添加PATH可以确保node_modules使用这些可执行文件(来自文件夹),而不是也可能安装在 Docker 映像内的系统上的任何其他可执行文件。

我需要它吗?

简短回答:通常不会。它应该是可选的。

长答案:将 设定为发出的 或 命令所在的路径应该WORKDIR足以找到正确的二进制文件,从而成功执行。但例如,我遇到了 Docker 无法找到文件的情况(我在 VSCode 中进行了相当复杂的设置。添加该行解决了我的问题。node_modulesRUNCMDENTRYPOINTDockerfiledevcontainerENV PATH /app/node_modules/.bin:$PATH

因此,如果您想提高 Docker 设置的稳定性以确保一切按预期工作,只需添加该行即可。


ric*_*y89 5

所以我认为这一行的好处是将Docker容器中的node_modules路径添加到PATH相关容器上的s列表中。如果你使用的是 Mac(或者我认为是 Linux)并运行:

$ echo $PATH  
Run Code Online (Sandbox Code Playgroud)

您应该看到用于从终端运行全局命令的路径列表gulp,即huskyyarn等。

上面的命令会将 node_modules 路径添加到 docker 容器中的 PATH 列表中,以便这些命令(如果需要)可以在它们将工作的容器内全局运行。


Mau*_*ldi 2

对于每个命令,例如FROMCOPYRUNCMD...,Docker 使用该命令的结果创建一个映像,该映像称为层。最终图像是所有图层合并的结果。

如果使用该COPY命令将所有代码存储在一层中,它将比存储带有代码路径的环境变量更好。

这就是缓存层有好处的原因。

有关图层的更多信息,请查看这篇非常好的文章。