我正在尝试为可用于管道作业的自定义映像创建Dockerfile。我想在第一阶段的形象是节点和第二阶段的形象是Ubuntu的。这是我目前拥有的。当我以交互方式运行容器时,我可以使用“node”命令。但是,当我输入“npm”时,我得到以下错误:
node:internal/modules/cjs/loader:1031
throw err;
^
Error: Cannot find module '../lib/cli.js'
Require stack:
- /usr/local/bin/npm
at Function.Module._resolveFilename (node:internal/modules/cjs/loader:1028:15)
at Function.Module._load (node:internal/modules/cjs/loader:873:27)
at Module.require (node:internal/modules/cjs/loader:1100:19)
at require (node:internal/modules/cjs/helpers:108:18)
at Object.<anonymous> (/usr/local/bin/npm:2:1)
at Module._compile (node:internal/modules/cjs/loader:1198:14)
at Object.Module._extensions..js (node:internal/modules/cjs/loader:1252:10)
at Module.load (node:internal/modules/cjs/loader:1076:32)
at Function.Module._load (node:internal/modules/cjs/loader:911:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12) {
code: 'MODULE_NOT_FOUND',
requireStack: [ '/usr/local/bin/npm' ]
}
字符串
以下是我在Dockerfile中使用的代码:
# Stage 1: Node.js/npm stage
FROM node:16 AS node
WORKDIR /app
# Stage 2: ubuntu stage
FROM ubuntu
# Set the working directory in the container
WORKDIR /app
# Copy the Node.js/npm components from the Node.js/npm stage
COPY --from=node /usr/local/bin/node /usr/local/bin/
COPY --from=node /usr/local/bin/npm /usr/local/bin/
型
我希望“npm”命令返回一个npm选项列表,或者至少在输入npm --version时显示版本。
1条答案
按热度按时间deyfvvtc1#
Node.JS比
node
二进制文件更多。您看到的错误消息是,它期望在/usr/local/lib
中找到它的运行时库,但您没有将它们复制到映像中。除非你知道一个程序是一个单一的静态二进制文件(这是不寻常的),否则很难将一个程序从一个Docker映像
COPY
到另一个。您很容易丢失运行时支持文件、配置文件和Linux共享库等内容。考虑到您显示的Dockerfile,没有特别的理由尝试在普通Ubuntu映像中重新安装Docker-derived Node。只需要构建你的应用镜像
FROM node
,就像这个通用的Node应用Dockerfile一样:字符串
如果需要将前端应用程序编译为静态文件,请将此方法与多阶段生成结合使用。如果你需要以交互方式运行
npm
,那么你可能会发现在主机上安装Node而不涉及Docker会容易得多。