node.js - 从 typescript 构建的 JS 文件如果独立运行会停止工作,但如果从 dist 文件夹运行则不会
问题描述
所以,这很奇怪,但我会试着解释一下。我有一个打字稿项目(确切地说是一个 discord.js 机器人)。我想有一个 dockerfile 构建然后运行所述项目。
受这篇文章的启发,我最终得到了以下 dockerfile :
FROM node:16 AS builder
WORKDIR /usr/src/app
COPY package.json yarn.lock ./
RUN yarn install --frozen-lockfile
COPY . .
RUN yarn build
FROM node:16 AS production-prepare
WORKDIR /usr/src/app
COPY --from=builder /usr/src/app/package.json /usr/src/app/yarn.lock ./
COPY --from=builder /usr/src/app/dist ./
RUN yarn install --production --frozen-lockfile
FROM gcr.io/distroless/nodejs:16
WORKDIR /app/src/app
COPY --from=production-prepare /usr/src/app ./
#This is correct for googles distroless image
CMD ["index.js"]
现在对我来说这应该可以了,我们将 typescript 文件构建为 JS。我们确保我们只有所需的(生产)包,并在无发行版映像中运行它。
现在,机器人启动。但是,它不能正常工作,某些命令不起作用,有些似乎起作用,我还没有完全弄清楚原因。
因此,我尝试通过复制文件并运行相同的命令来执行与 dockerfile 相同的流程(尽可能接近)来调试它。所以我将package.json
andyarn.lock
文件复制到一个新文件夹并运行yarn install --frozen-lockfile
. 我复制了其他所有内容( bar node_modules
、 TSdist
文件夹和 my .env
,因为它们在 my 中.dockerignore
)并运行yarn build
(即tsc --build
)。
然后我创建了第二个文件夹,将第一个文件夹中的package.json
andyarn.lock
文件复制到那里,将第一个文件夹中的所有内容复制dist
到那里,然后运行yarn install --production --frozen-lockfile
然后尝试执行node index.js
.
同样的结果,机器人在技术上启动但不能正常工作。但是,如果我转到第一个文件夹并运行node dist/index.js
它确实可以正常工作!包的唯一区别是typescript
和@types/glob
(这些是我唯一的 devDependencies)。
因此,在使用原始 TS 文件运行构建和将构建的 JS 文件移走之间的某个地方,有些东西会中断。在弄清楚什么时,我完全不走运。
解决方案
推荐阅读
- javascript - React JS:为时间表创建单元格,其中同一行上的单元格不能包含相同的团队名称
- pycuda - 工作线程中的 TensorRT 执行上下文无法正常工作或导致崩溃
- rest - 从休息服务设计正确的返回响应
- c++ - 在 TFT 上显示日期而不使用 char 形式的数字数组
- python - 深度学习 CNN 图像预处理
- redis - 反应式 Redis 订阅者无法使用 Kotlin 协程工作
- html - 来自 Nuxt 的静态生成的 html 页面上的动态内容的可能性以及来自 REST API 的响应
- security - 如何快速找到 npm audit 建议的依赖链的正确修复?
- python - 删除行时QtFormLayout不对齐
- r - 减少 R 中的 memory.limit() 以保留远程桌面连接