Reactjs 在构建Docker映像时已安装Typescript时要求安装

Reactjs 在构建Docker映像时已安装Typescript时要求安装,reactjs,typescript,docker,next.js,Reactjs,Typescript,Docker,Next.js,我正在尝试构建一个使用Typescript的Next.js/React应用程序的docker映像 Typescript已经安装,我可以在没有docker的情况下在本地运行构建 然而,随着docker形象的建立,我得出以下观点: Step 8/10 : RUN npm run build ---> Running in ee577c719739 > project@0.0.5 build /app > next build Creating an optimized pro

我正在尝试构建一个使用Typescript的Next.js/React应用程序的docker映像

Typescript已经安装,我可以在没有docker的情况下在本地运行构建

然而,随着docker形象的建立,我得出以下观点:

Step 8/10 : RUN npm run build
 ---> Running in ee577c719739

> project@0.0.5 build /app
> next build

Creating an optimized production build...
Attention: Next.js now collects completely anonymous telemetry regarding usage.
This information is used to shape Next.js' roadmap and prioritize features.
You can learn more, including how to opt-out if you'd not like to participate in this anonymous program, by visiting the following URL:
https://nextjs.org/telemetry

It looks like you're trying to use TypeScript but do not have the required package(s) installed.

Please install typescript by running:

        npm install --save-dev typescript

If you are not trying to use TypeScript, please remove the tsconfig.json file from your package root (and any TypeScript files).

npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! project@0.0.5 build: `next build`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the project@0.0.5 build script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.
我已经安装了Typescript。这让我很困惑

我使用的Docker图像如下所示:

FROM gcr.io/companyX/companyX-node-base:12-alpine

# Copy in the project files
COPY . .

# Clean
USER root
RUN rm -fr node_modules

ENV NODE_ENV=production

COPY package*.json ./

RUN npm install && \
    npm cache clean --force

RUN npm run build

EXPOSE 3000

# Running the app
CMD [ "npm", "start" ]
归功于@Ahmed Rebai

必须手动将typescript添加到Package.json文件中的依赖项中。正常的npm安装只会在您运行时将其添加到开发中(即使在Docker之外)

导出节点\u ENV=生产
npm安装
它只安装
包.json中的
依赖项
,而不安装
devDependencies
。另一方面,您可能需要
devdependency
来获得
typescript
之类的工具

这里的好解决方案是使用多阶段构建。第一阶段安装所有依赖项;第二阶段只复制运行应用程序所需的内容

来自gcr.io/companyX/companyX节点库的
:12
#仅复制安装依赖项所需的部分
#(如果package.json没有更改,则可以避免重建)
复制package.json package.lock。
#安装依赖项(包括开发人员依赖项)
运行npm安装
#复制项目的其余部分
#(在.dockrignore文件中包括节点_模块)
复制
#建设项目
运行npm运行构建
#第二阶段:运行时
来自gcr.io/companyX/companyX节点库:12
环境节点_ENV=生产
#再次获取依赖项,但这次仅安装
#运行时依赖项
复制package.json package.lock。
运行npm安装
#从第一阶段获取构建的应用程序
复制--from=build/app/dist
#设置运行时元数据
暴露3000
CMD[“npm”,“开始”]
#CMD[“node”,“dist/index.js”]

请注意,这种方法与使用来自主机的任意内容覆盖应用程序内容,或尝试将库存储在Docker卷中的设置不兼容。最终映像是自包含的,不需要任何主机内容,可以像在其他系统上一样运行,而无需单独复制源代码。

在生产环境中,它不安装devdependency。因此,您可以在npm安装后设置
节点\u ENV

FROM gcr.io/companyX/companyX-node-base:12-alpine

# Copy in the project files
COPY . .

# Clean
USER root
RUN rm -fr node_modules

COPY package*.json ./

RUN npm install && \
    npm cache clean --force

ENV NODE_ENV=production

RUN npm run build

EXPOSE 3000

# Running the app
CMD [ "npm", "start" ]

在aws amplify上部署next.js应用程序时,我也遇到了同样的错误。 我不想将typescript移动到devdependencies的依赖项

我的解决方案只是更改构建设置

“npm安装” 到 'npm安装--dev typescript&&npm安装'

错误消失了


但我不确定这是否适用于docker。

您的package.json文件中提到了这一点?我一直在尝试npm install typescript--save,我认为这会将其添加到我的正常依赖项中,但我错了,它只适用于开发人员依赖项。谢谢你,兄弟。将其手动添加到正常依赖项中,然后运行。:)@在我的情况下,是的。但我还是收到了那个错误信息。看看热装怎么样?在复制src文件并编译它们时,热重新加载功能不再起作用。即使您使用Docker进行部署,热重新加载功能在主机节点开发环境中也应该可以正常工作。但如果您使用生成文件来显示web应用程序,则代码更改不会直接反映出来。它需要另一个构建来显示更改。(见我的问题:)这对我不起作用。我仍然收到相同的错误消息。请参见类型脚本应仅位于
devDependencies
中。将其添加到
依赖项中
意味着您在生产中使用的是typescript,而不是(至少不应该)。Typescript编译代码,然后在生产环境中运行输出的JavaScript代码。