Docker 构建失败的日志
Logs for failed Docker build
我有一个简单的 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
下载库时,我也成功地构建了图像。
我的问题是
- 为什么在我使用全局库时图像构建过程出错
- 在哪里可以找到终端中指示的日志文件。我的本地笔记本电脑没有 /root/ 文件夹。
Docker 容器将文件系统与主机和其他容器隔离开来。容器中的 /usr/local/lib/node_modules
与主机上的同一目录完全不同,同样,主机上的 /root
与任何给定容器中的 /root
是分开的。这就是映像构建无法使用主机全局模块的原因,也是您无法阅读详细日志的原因。
就 Docker 文件而言,重要的是确保 package.json
文件完整。 npm link
不行;确保你 npm install body-parser
和你需要的任何其他模块,并且所有依赖项都列在 package.json
和 package-lock.json
.
中
主机的 node_modules
树在几个方面可能与图像的不同(最明显的是如果您在非 Linux 主机上使用 Linux 容器)。通过确保 node_modules
列在与 Docker 文件相同的目录中的 .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
以获取更多信息。)
我有一个简单的 nodejs 应用程序。在尝试加载我使用 npm link library1 library2
的库时,它创建了指向 /usr/local/lib/node_modules 的符号链接。我正在尝试使用我的 Dockerfile
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
下载库时,我也成功地构建了图像。
我的问题是
- 为什么在我使用全局库时图像构建过程出错
- 在哪里可以找到终端中指示的日志文件。我的本地笔记本电脑没有 /root/ 文件夹。
Docker 容器将文件系统与主机和其他容器隔离开来。容器中的 /usr/local/lib/node_modules
与主机上的同一目录完全不同,同样,主机上的 /root
与任何给定容器中的 /root
是分开的。这就是映像构建无法使用主机全局模块的原因,也是您无法阅读详细日志的原因。
就 Docker 文件而言,重要的是确保 package.json
文件完整。 npm link
不行;确保你 npm install body-parser
和你需要的任何其他模块,并且所有依赖项都列在 package.json
和 package-lock.json
.
主机的 node_modules
树在几个方面可能与图像的不同(最明显的是如果您在非 Linux 主机上使用 Linux 容器)。通过确保 node_modules
列在与 Docker 文件相同的目录中的 .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
以获取更多信息。)