设置 Docker + TypeScript + Node(在正在运行的容器中热重新加载代码更改)🦄🚀 步骤 1:使用 TypeScript 和 Express 创建服务器步骤 2:Docker 开发和生产步骤

2025-06-08

设置 Docker + TypeScript + Node(在正在运行的容器中热重新加载代码更改)🦄🚀

步骤 1:使用 TypeScript 和 Express 创建服务器

第 2 步:Docker 开发和生产步骤

我喜欢 TypeScript,也喜欢 Docker。然而,把这两者结合起来却非常麻烦。

今天,我将引导您完成一个使用 TypeScript/Node 项目的非常基本的多阶段 Docker 设置。

这个设置解决了我在使用该技术栈时遇到的最大挑战......让我的 TypeScript 在生产中编译为 JavaScript,并能够在运行的容器中进行开发,以监视我的 TypeScript 代码中所作的更改。

本教程的所有代码都可以在这里找到:)

GitHub 徽标 justDare / TypeScript-Node-Docker

TypeScript + Node + Docker 设置用于开发和生产,并带有热重载

喜欢 YouTube?点击此处查看视频教程:

步骤 1:使用 TypeScript 和 Express 创建服务器

让我们用 TypeScript 启动一个简单的 Express 服务器并让它在本地运行(之后我们会将它 dockerize!)。

为项目创建一个目录并进入该目录:

mkdir ts-node-docker
cd ts-node-docker
Enter fullscreen mode Exit fullscreen mode

初始化一个节点项目并在出现提示时添加您想要的任何值(我只​​是通过按下回车键跳过所有内容...):

npm init
Enter fullscreen mode Exit fullscreen mode

接下来,安装 TypeScript 作为开发依赖项:

npm i typescript --save-dev
Enter fullscreen mode Exit fullscreen mode

下载完成后,创建一个 tsconfig.json 文件:

npx tsc --init
Enter fullscreen mode Exit fullscreen mode

现在我们应该在项目目录的根目录中有一个 tsconfig.json,让我们在其中编辑以下条目:

"baseUrl": "./src"
"target": "esnext"
"moduleResolution": "node"
"outdir": "./build"
Enter fullscreen mode Exit fullscreen mode

baseUrl告诉 TS 我们的 .ts 源代码文件将位于./src文件夹

目标可以是你喜欢的任何版本的 JS,选择esnext

对于节点项目,必须将moduleResolution设置为节点。

outdir告诉 TS 在编译 TS 文件时将编译后的 JavaScript 代码放在哪里

接下来,让我们安装 express,然后将其类型作为开发依赖项:

npm i --save express
npm i -D @types/express
Enter fullscreen mode Exit fullscreen mode

太棒了,我们已经准备好编写服务器代码了。让我们在项目根目录下创建一个src/文件夹,并添加一个index.ts文件。

在index.ts中,添加以下代码:

import express from 'express';

const app = express();
app.listen(4000, () => {
  console.log(`server running on port 4000`);
});
Enter fullscreen mode Exit fullscreen mode

这就是我们启动服务器所需要的全部内容,但现在我们需要让它运行起来并观察我们对代码所做的更改。

为此,我们将使用ts-nodenodemon,现在安装:

npm i -D ts-node nodemon
Enter fullscreen mode Exit fullscreen mode

使用 nodemon,我们可以在代码运行时监视文件,而 ts-node 让我们可以非常轻松地运行用 TS 编写的节点项目。

我喜欢在配置文件中设置我的 nodemon,因此我将在项目文件夹的根目录中添加一个 nodemon.json 文件并添加以下选项:

{
  "verbose": true,
  "ignore": [],
  "watch": ["src/**/*.ts"],
  "execMap": {
    "ts": "node --inspect=0.0.0.0:9229 --nolazy -r ts-node/register"
  }
}
Enter fullscreen mode Exit fullscreen mode

这里的关键点是watch命令(它告诉 nodemon 应该监视哪些文件)和execMap中的ts选项。

这告诉 nodemon 如何处理 TS 文件。我们用 node 运行它们,添加一些调试标志,并注册 ts-node。

好的,现在我们可以在 package.json 中添加使用 nodemon 启动项目的脚本了。请继续将以下内容添加到 package.json 中:

"scripts": {
    "start": "NODE_PATH=./build node build/index.js",
    "build": "tsc -p .",
    "dev": "nodemon src/index.ts",
}
Enter fullscreen mode Exit fullscreen mode

dev命令使用 nodemon 启动我们的项目。build命令将我们的代码编译成 JavaScript,start命令运行我们构建的项目。

我们指定NODE_PATH来告诉我们构建的应用程序项目的根目录在哪里。

您现在应该能够使用热重载运行该应用程序,如下所示:

npm run dev 
Enter fullscreen mode Exit fullscreen mode

太棒了!现在让我们把它docker化吧🐳

第 2 步:Docker 开发和生产步骤

如果你还没有安装 Docker,现在就安装吧。我还推荐他们的桌面应用,这两个应用都可以在他们的网站上找到。

接下来,让我们在项目目录的根目录下添加一个Dockerfile,并为开发步骤添加以下代码:

FROM node:14 as base

WORKDIR /home/node/app

COPY package*.json ./

RUN npm i

COPY . .
Enter fullscreen mode Exit fullscreen mode

这会拉入一个节点映像,为我们的容器设置一个工作目录,复制我们的 package.json 并安装它,然后将我们所有的项目代码复制到容器中。

现在,在同一个文件中,添加生产步骤:

FROM base as production

ENV NODE_PATH=./build

RUN npm run build
Enter fullscreen mode Exit fullscreen mode

这扩展了我们的开发步骤,设置了我们的环境变量,并构建了可在生产中运行的 TS 代码。

请注意,我们还没有添加任何命令来运行开发或生产构建,这就是我们的 docker-compose 文件的用途!

在我们的目录根目录创建一个docker-compose.yml文件并添加以下内容:

version: '3.7'

services:
  ts-node-docker:
    build:
      context: .
      dockerfile: Dockerfile
      target: base
    volumes:
      - ./src:/home/node/app/src
      - ./nodemon.json:/home/node/app/nodemon.json
    container_name: ts-node-docker
    expose:
      - '4000'
    ports:
      - '4000:4000'
    command: npm run dev
Enter fullscreen mode Exit fullscreen mode

这将创建一个名为ts-node-docker 的容器,使用我们创建的 dockerfile,并运行构建步骤(参见目标)。

它还为我们的源代码和 nodemon 配置创建卷,您需要它来启用热重加载!

最后,它将我们机器上的端口映射到 docker 容器(这必须与我们用 express 设置的端口相同)。

完成后,我们可以构建我们的docker镜像:

docker-compose build
Enter fullscreen mode Exit fullscreen mode

您应该能够在终端中看到构建步骤。

接下来,我们可以按如下方式运行容器:

docker-compose up -d
Enter fullscreen mode Exit fullscreen mode

成功!现在你应该有一个正在运行的容器,它会记录你对 TypeScript 源代码所做的任何更改。我强烈建议使用 docker 桌面应用来查看正在运行的容器。

替代文本

您可以像这样停止容器:

docker-compose down
Enter fullscreen mode Exit fullscreen mode

现在我们还想在生产中运行这个东西,所以让我们为此创建一个单独的docker-compose.prod.yml :

version: '3.7'

services:
  ts-node-docker:
    build:
      target: production
    command: node build/index.js
Enter fullscreen mode Exit fullscreen mode

该文件将与我们的第一个 docker-compose 文件一起工作,但它将覆盖我们想要在生产中更改的命令。

因此,在这种情况下,我们只需针对 Dockerfile 的生产步骤,并运行node build/index.js而不是npm run dev,这样我们就可以启动编译的项目。

要在生产中启动我们的容器,请运行:

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d   
Enter fullscreen mode Exit fullscreen mode

这告诉 docker-compose 要使用哪些文件,后面的文件将覆盖前面的文件中的任何步骤。

现在,您应该已经让构建的应用程序像在生产中一样运行,无需热重新加载!

最后,我讨厌输入所有这些 docker 命令,因此我将在项目根目录中创建一个Makefile,并添加可以从命令行执行的以下命令(例如make up):

up:
    docker-compose up -d

up-prod:
    docker-compose -f docker-compose.yml -f docker-compose.prod.yml up

down: 
    docker-compose down
Enter fullscreen mode Exit fullscreen mode

如果你坚持读到最后,恭喜你,谢谢你。希望这篇文章能让一些人在尝试整合这两项令人惊叹的技术时,轻松很多。

如果您喜欢这个,我也会在我的YouTube 频道上发布教程和技术相关视频

我们还有一个不断发展的技术相关Discord 频道,所以欢迎随时访问。

祝你编程愉快!👨‍💻 🎉

链接已锁定:https://dev.to/dariansampare/setting-up-docker-typescript-node-hot-reloading-code-changes-in-a-running-container-2b2f
PREV
JWT 如何工作并且安全吗?
NEXT
Git Rebase 和黄金法则解释