使用Node和Ubuntu的多阶段Docker构建

wfsdck30  于 2023-08-03  发布在  Docker
关注(0)|答案(1)|浏览(145)

我正在尝试为可用于管道作业的自定义映像创建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时显示版本。

deyfvvtc

deyfvvtc1#

Node.JS比node二进制文件更多。您看到的错误消息是,它期望在/usr/local/lib中找到它的运行时库,但您没有将它们复制到映像中。
除非你知道一个程序是一个单一的静态二进制文件(这是不寻常的),否则很难将一个程序从一个Docker映像COPY到另一个。您很容易丢失运行时支持文件、配置文件和Linux共享库等内容。
考虑到您显示的Dockerfile,没有特别的理由尝试在普通Ubuntu映像中重新安装Docker-derived Node。只需要构建你的应用镜像FROM node,就像这个通用的Node应用Dockerfile一样:

FROM node:lts
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY ./ ./
CMD ["npm", "run", "start"]

字符串
如果需要将前端应用程序编译为静态文件,请将此方法与多阶段生成结合使用。如果你需要以交互方式运行npm,那么你可能会发现在主机上安装Node而不涉及Docker会容易得多。

相关问题