[英]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"]
在最后階段,您將構建階段的dist
和node_modules
樹COPY
到當前目錄中。 您需要明確 state COPY
右側的子目錄名稱。
COPY --from=build /service/dist/ ./dist/
COPY --from=build /service/node_modules/ ./node_modules/
另請參閱有關COPY
的 Dockerfile 參考:由於COPY
源是目錄,因此目錄的內容將復制到目標而不是目錄本身。 這不同於正常的 Unix cp
或mv
命令。
您應該能夠在構建的圖像之上運行調試容器來驗證這一點; 例如
docker run --rm your-image ls
應該顯示構建dist
樹中的server
子目錄,以及所有單獨安裝的 Node 包,所有這些都直接在圖像的/service
目錄中,而不是在子目錄中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.