簡體   English   中英

Nodejs - 找不到模塊(Docker)

[英]Nodejs - cannot find module (Docker)

嘗試在 Docker 中為我的 nodejs 應用程序測試多階段構建,但我一直遇到

internal/modules/cjs/loader.js:983
  throw err;
  ^

Error: Cannot find module '/service/dist/server/server.js'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:980:15)
    at Function.Module._load (internal/modules/cjs/loader.js:862:27)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12)
    at internal/main/run_main_module.js:18:47 {
  code: 'MODULE_NOT_FOUND',
  requireStack: []
}

我的 Dockerfile

FROM mybaseimage as dev
WORKDIR /service

COPY src ./src
COPY package*.json ./
COPY yarn.lock ./
COPY tsconfig.json ./

# This is required to build native modules
# https://github.com/nodejs/docker-node/blob/main/docs/BestPractices.md#node-gyp-alpine
RUN apk add --no-cache \
    g++ \
    make \
    py3-pip

# Not clearing the cache here saves us time in the next step
RUN yarn install \
    && yarn compile

# Re-use the dev container to create a production-ready node_modules dir
FROM dev AS build
WORKDIR /service

RUN rm -rf /service/node_modules\
    && yarn install --production=true \
    && yarn cache clean

FROM mybaseimage AS prod
WORKDIR /service

COPY --from=build /service/dist/ .
COPY --from=build /service/node_modules/ .

# https://github.com/nodejs/docker-node/blob/main/docs/BestPractices.md#handling-kernel-signals
RUN apk add --no-cache dumb-init


EXPOSE 5678
ENTRYPOINT ["/usr/bin/dumb-init", "--"]
CMD ["node", "dist/server/server.js"]

我的package.json

"serve": "node dist/server/server.js",
"start": "concurrently \"docker-compose up\" \"yarn watch\"",

我之前的工作 Dockerfile 是

FROM mybaseimage

#set working directory
WORKDIR /service

# Copy the needed files into the container
COPY src ./src
COPY package*.json ./
COPY yarn.lock ./
COPY tsconfig.json ./

RUN apk update
RUN apk add python3
RUN echo python3 --version
RUN yarn install
RUN yarn compile


EXPOSE 5678
ENTRYPOINT ["npm", "run", "serve"]

在最后階段,您將構建階段的distnode_modulesCOPY到當前目錄中。 您需要明確 state COPY右側的子目錄名稱。

COPY --from=build /service/dist/ ./dist/
COPY --from=build /service/node_modules/ ./node_modules/

另請參閱有關COPY的 Dockerfile 參考:由於COPY源是目錄,因此目錄的內容將復制到目標而不是目錄本身。 這不同於正常的 Unix cpmv命令。

您應該能夠在構建的圖像之上運行調試容器來驗證這一點; 例如

docker run --rm your-image ls

應該顯示構建dist樹中的server子目錄,以及所有單獨安裝的 Node 包,所有這些都直接在圖像的/service目錄中,而不是在子目錄中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM