首页 > 解决方案 > 从 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.jsonandyarn.lock文件复制到一个新文件夹并运行yarn install --frozen-lockfile. 我复制了其他所有内容( bar node_modules、 TSdist文件夹和 my .env,因为它们在 my 中.dockerignore)并运行yarn build(即tsc --build)。

然后我创建了第二个文件夹,将第一个文件夹中的package.jsonandyarn.lock文件复制到那里,将第一个文件夹中的所有内容复制dist到那里,然后运行yarn install --production --frozen-lockfile然后尝试执行node index.js.

同样的结果,机器人在技术上启动但不能正常工作。但是,如果我转到第一个文件夹并运行node dist/index.js它确实可以正常工作!包的唯一区别是typescript@types/glob(这些是我唯一的 devDependencies)。

因此,在使用原始 TS 文件运行构建和将构建的 JS 文件移走之间的某个地方,有些东西会中断。在弄清楚什么时,我完全不走运。

标签: node.jstypescriptdiscord.jstsc

解决方案


推荐阅读