【问题标题】:Logs for failed Docker buildDocker 构建失败的日志
【发布时间】:2021-04-02 12:26:09
【问题描述】:

我有一个简单的 nodejs 应用程序。在尝试加载库时,我使用了 npm link library1 library2,它创建了指向 /usr/local/lib/node_modules 的符号链接。我正在尝试使用 Dockerfile 中的以下说明构建相同的 docker 映像

FROM node:13-alpine
ENV MONGO_DB_USERNAME=admin \
    MONGO_DB_PWD=password
RUN mkdir -p /home/app 
COPY ./app /home/app
WORKDIR /home/app
RUN npm install
CMD ["node", "server.js"]

现在在构建图像时,它错误地输出了RUN npm install 部分,并在终端中显示以下输出

npm ERR! syscall access
npm ERR! path /home/app/node_modules/body-parser
npm ERR! errno -2
npm ERR! enoent ENOENT: no such file or directory, access '/home/app/node_modules/body-parser'
npm ERR! enoent This is related to npm not being able to find a file.
npm ERR! enoent
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-12-23T21_41_24_539Z-debug.log

在我的代码位置删除 node_modules 文件夹后,我能够成功构建映像。当我通过代码位置的npm install libary1 library2 下载库时,我也成功地构建了图像。

我的问题是

  1. 为什么我使用全局库时映像构建过程出错
  2. 在哪里可以找到终端中指示的日志文件。我的本地笔记本电脑没有 /root/ 文件夹。

【问题讨论】:

  • 您能否提供完整的 Dockerfile 或至少它来自哪个基础映像?此外,npm 错误表示日志位于 Docker 容器内的 /root 文件夹中,您是否需要通过 shell 访问容器或复制文件(使用 Docker 的 execcp 命令。
  • 很抱歉错过了完整的 Dockerfile。更新了它。我需要执行哪个容器来获取日志。我注意到很少有临时容器被启动和停止(而不是在映像构建成功的情况下被删除)。我试图重新启动停止的容器,但它会在一分钟内停止,而不是让我更改 exec
  • 您如何尝试启动已停止的容器?您是否正在使用诸如docker run -it CONTAINER bash 之类的命令?此错误似乎与 npm 包文件有关,但这可能有助于获取这些日志。
  • 我不确定您的意思是 docker run 还是 docker exec。但是我使用'docker ps -a'然后使用'docker start '和'docker exec -it bash'获得了容器ID。 docker exec 将在一分钟内退出,因为为构建映像而创建的临时容器将停止

标签: node.js docker node-modules docker-build


【解决方案1】:

Docker 容器具有与主机和其他容器隔离的文件系统。容器中的/usr/local/lib/node_modules 与主机上的同一目录完全不同,同样,主机上的/root 与任何给定容器中的/root 是分开的。这就是映像构建无法使用主机全局模块的原因,也是您无法阅读详细日志的原因。

就 Dockerfile 而言,重要的是确保 package.json 文件是完整的。 npm link 不起作用;确保 npm install body-parser 和您需要的任何其他模块,并且所有依赖项都列在 package.jsonpackage-lock.json 中。

主机的node_modules 树可以在几个方面与映像不同(最明显的是,如果您在非 Linux 主机上使用 Linux 容器)。通过确保node_modules 列在与 Dockerfile 相同的目录中的.dockerignore file 中,您可以避免此处出现问题并加快构建速度。

您说删除主机的 node_modules 目录可以修复构建,因此将其从 docker build 上下文中排除也可能会修复它。


如果这不起作用并且您仍想查看日志,您可以在基于部分构建的容器中获取一个 shell,直到最后一个成功步骤。说docker build的输出是

Step 5/7 : WORKDIR /home/app
 ---> 123456789abc
Step 6/7 : RUN npm install
 ... the error text you quoted ...

该十六进制数字是有效的 Docker 映像 ID,因此您可以手动重复上一个(失败)步骤,从上一个(成功)步骤的结果开始。运行:

host$ sudo docker run --rm -it 123456789abc sh
13579bdf2468# npm install
...
npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2020-12-23T21_41_24_539Z-debug.log
13579bdf2468# cat /root/.npm/_logs/2020-12-23T21_41_24_539Z-debug.log

(最新版本的 Docker 有 a different build engine 和一些不同的输出。您可能需要添加 --progress=plain 以获取更多信息。)

【讨论】:

  • 感谢您澄清错误以及如何基于部分构建登录容器的步骤。但是 /root 目录中没有名称为 .npm 的目录。我实际上运行了ls alR | grep "<filename>",但它没有输出。只是为了确保我也做了screen ~/Library/Containers/com.docker.docker/Data/vms/0/tty 并检查了 /root/.npm 中的日志仍然不是目录或文件。我错过了什么吗?我的意思是我知道这次错误的原因,所以我可以保留日志,但如果将来出现错误,我想了解日志的位置。
  • 我稍微澄清了答案:您需要从最后一个成功的步骤开始,在交互式外壳中手动重新运行最后一步。一旦RUN 步骤失败,它的所有输出都会消失。 (它不会在主机上或任何地方的隐藏 Linux VM 中。)(IME 你通常不需要这个日志,ENOENT 错误节点已经打印出来就是足够的信息。)
  • 它有效,我能够复制错误和日志。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2022-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多