当前位置: 首页 > news >正文

【Express.js】Docker部署

Docker部署

本节我们来介绍如何使用 Docker 部署 express 应用

准备工作

  • linux 系统
  • 安装好 Docker
  • 一个基础的 evp-express-cli 项目,选上 pkg 工具包
  • Docker 的详细用法本文不做介绍,请先自行查阅了解

在 Docker 中部署源码

一个很简单的部署方法就是,拉取一个 node 基础镜像,直接在里面运行 express 项目:
以下是 .dockerignore 示例:

node_modules
dist

以下是响应的 Dockerfile 示例:

# Build environment
FROM node:16
ENV NODE_ENV=productionWORKDIR /appCOPY . .RUN npm installEXPOSE 8080
CMD ["node src/index.js"]

基本流程就是:

  1. 拉取node镜像
  2. 指定工作目录
  3. 拷贝项目源码及资源文件
  4. 安装依赖
  5. 暴露端口
  6. 设置启动命令

在 Docker 中构建部署

上面采取的是直接部署源代码,当然也可以先对源码进行构建再部署。这里又可以分为两种,一种仍然需要 node 运行时,仅仅借助 rollup 之类的工具将源码打包为单个 .js 文件,然后部署时只需拷贝这单个文件即可,具体过程无需再做介绍

另一种是脱离 node 运行时,使用 pkg 构建 express 项目,最终部署构建产物到纯净的 linux 镜像即可。如果你在进行 docker 部署前,事先构建好再部署,那具体做法也不需介绍,本文介绍的是在 docker 中阶段的从零构建到部署的过程:

编写 Dockerfile:

  1. 拉取合适的 node 镜像作为构建环境,builder 是构建镜像别名,可以随便取(后面有用):
# Build environment
FROM node:16 AS builder
ENV NODE_ENV=production
  1. 拷贝依赖配置文件(package.jsonpackage-lock.json*)到指定目录(后面有用)
WORKDIR /appCOPY ["package.json", "package-lock.json*", "./"]
  1. 安装依赖包
RUN npm install
  1. 拷贝源码以其它要一并被打包进可执行程序的文件
ADD src src
ADD assets assets
  1. 构建适用于linux的可执行程序,示例的产物名为 DockerDeploy(后面有用)
RUN npm run build:linux
  1. 拉取一个 linux 镜像作为运行环境,示例选用了 debian,具体能用哪个还要视项目而定
# lightly runtime environment
FROM debian
  1. 设置时区,如果需要的话
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezone
  1. 构建镜像将中构建好的可执行程序拷贝到到运行镜像下的指定目录
    语法:COPY --from=构建镜像别名 可执行程序路径 指定目录路径
COPY --from=builder /app/dist/DockerDeploy /app/
  1. 拷贝外部的资源文件和文件夹(如果有的话),示例没有,略过,如有,用 ADDCOPY 即可
  2. 暴露端口,并在指定目录下运行可执行程序
WORKDIR /appEXPOSE 8080
CMD ["./starfolder-service"]

以下是完整的 Dockerfile 示例:

# Build environment
FROM node:16 AS builder
ENV NODE_ENV=productionWORKDIR /appCOPY ["package.json", "package-lock.json*", "./"]RUN npm installADD src srcRUN npm run build:linux# lightly runtime environment
FROM debianRUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo 'Asia/Shanghai' >/etc/timezoneCOPY --from=builder /app/dist/starfolder-service /app/WORKDIR /appEXPOSE 8080
CMD ["./DockerDeploy"]

这样的分阶段构建过程,可以尽可能得减小最终的镜像体积


下一节-pm2进程管理

相关文章:

【Express.js】Docker部署

Docker部署 本节我们来介绍如何使用 Docker 部署 express 应用 准备工作 linux 系统安装好 Docker一个基础的 evp-express-cli 项目,选上 pkg 工具包Docker 的详细用法本文不做介绍,请先自行查阅了解 在 Docker 中部署源码 一个很简单的部署方法就是…...

面试2:通用能力

15丨如何做好开场:给自我介绍加“特效 第一层,满足面试官对信息的期待 这是对自我介绍的基本要求,把个人信息、主要经历、经验和技能有条理地组织起来, 有逻辑地讲出来。需要找出多段经历的关联性和发展变化,形成连…...

zookeeper/HA集群配置

1.zookeep配置 1.1 安装4台虚拟机 (1)按照如下设置准备四台虚拟机,其中三台作为zookeeper,配置每台机器相应的IP,hostname,下载vim,ntpdate配置定时器定时更新时间,psmisc&#xff…...

4.6版本Wordpress漏洞复现

文章目录 一、搭建环境二、漏洞复现1.抓包2.准备payload3.发送payload4.检查是否上传成功5.连接payload 国外的:Wordpress,Drupal,Joomla,这是国外最流行的3大CMS。国内则是DedeCMS和帝国,PHPCMS等。 国内的CMS会追求大…...

腾讯云学生专属便宜云服务器如何购买?

随着云计算技术的快速发展,越来越多的学生开始关注和使用云服务器。腾讯云作为国内知名的云计算服务提供商,推出了一系列针对学生的优惠活动,让更多学生能够享受到云服务器的便利和优势。本文将详细介绍如何购买腾讯云学生专属的便宜云服务器…...

逗号分隔String字符串 - 数组 - 集合,相互转换

1. 准备一个逗号分割字符串 String str "小张,小王,小李,小赵";2. 逗号分割字符串转换为集合(转换为集合之前会先转换为数组) // 第一种&#xff1a;先用split将字符串按逗号分割为数组&#xff0c;再用Arrays.asList将数组转换为集合 List<String> strList…...

基于blockqueue的生产和消费模型

线程篇下讲的是基于阻塞队列的生产者消费者模型。在学习这个之前我们先了解一些其他概念&#xff1a; 同步&#xff1a;在保证数据安全的条件下&#xff0c;让线程按某种特定的顺序依次访问临界资源。 通过上一节的代码我们实现了一个多线程抢票的程序&#xff0c;但结果显示…...

Editors(Vim)

文章目录 Editors(Vim)学哪一个编辑器&#xff1f;Vim Philosophy of VimModal editing 模态编辑Basics 基础知识Inserting text 插入文本Buffers, tabs, and windows 缓冲区、选项卡和窗口Command-line 命令行 Vim’s interface is a programming language. Vim的接口是一种编…...

【Leetcode】134.加油站

一、题目 1、题目描述 在一条环路上有 n 个加油站,其中第 i 个加油站有汽油 gas[i] 升。 你有一辆油箱容量无限的的汽车,从第 i 个加油站开往第 i+1 个加油站需要消耗汽油 cost[i] 升。你从其中的一个加油站出发,开始时油箱为空。 给定两个整数数组 gas 和 cost,如果你…...

设计模式-建造者(生成器)模式

文章目录 简介建造者模式的核心概念产品&#xff08;Product&#xff09;建造者&#xff08;Builder&#xff09;指挥者&#xff08;Director&#xff09;建造者模式与其他设计模式的关系工厂模式和建造者模式uml对比 建造者模式的实现步骤建造者模式的应用场景spring中应用 建…...

内存泄露排查思路

1、泄露情况 启动闪退运行一段时间宕机 2、排查步骤 获取堆内存快照dump使用VisualVM分析dump文件通过查看堆信息的情况&#xff0c;定位内存溢出问题 jmap -dump:formatb,fileheap.hprof pid -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath输出路径 3、在VisualVM中分…...

kafka学习-概念与简单实战

目录 1、核心概念 消息和批次 Topic和Partition Replicas Offset broker和集群 生产者和消费者 2、开发实战 2.1、消息发送 介绍 代码实现 2.2、消息消费 介绍 代码实现 2.3、SpringBoot Kafka pom application.yaml KafkaConfig producer consumer 1、核心…...

爬虫进阶-反爬破解5(selenium的优势和点击操作+chrome的远程调试能力+通过Chrome隔离实现一台电脑登陆多个账号)

目录 一、selenium的优势和点击操作 二、chrome的远程调试能力 三、通过Chrome隔离实现一台电脑登陆多个账号 一、selenium的优势和点击操作 1.环境搭建 工具&#xff1a;Chrome浏览器chromedriverselenium win用户&#xff1a;chromedriver.exe放在python.exe旁边 MacO…...

音视频编码格式-AAC ADT

例子:config 1408 1408(16进制) : 0001 0100 0000 1000 audioObjectType&#xff08;5bit&#xff09;为 00010 , 即 2&#xff0c; profie (audioObjectType -1 ) AAC LC samplingFrequencyIndex (4bit) 为 1000 , 即 8 , 对应的采样频率为 16000 channelConfiguration (…...

【计算机网络】网络编程接口 Socket API 解读(3)

Socket 是网络协议栈暴露给编程人员的 API&#xff0c;相比复杂的计算机网络协议&#xff0c;API 对关键操作和配置数据进行了抽象&#xff0c;简化了程序编程。 本文讲述的 socket 内容源自 Linux 发行版 centos 9 上的 man 工具&#xff0c;和其他平台&#xff08;比如 os-x …...

kafka知识小结

1.为什么分区数只能增加,不能减少? 按照Kafka现有的代码逻辑而言,此功能完全可以实现,不过也会使得代码的复杂度急剧增大。 另外实现此功能需要考虑的因素很多,比如删除掉的分区中的消息该作何处理? 如果随着分区一起消失则消息的可靠性得不到保障; 如果需要保留则又需…...

算法刷题记录-DP(LeetCode)

746. Min Cost Climbing Stairs 代码 int minCostClimbingStairs(vector<int>& cost) {if (cost.size()<2){return 0;}int cache[cost.size()1];cache[0]0;cache[1]0;for (int i 2; i < cost.size(); i) {cache[i] min(cache[i-2]cost[i-2],cache[i-1]cost[i…...

Springboot整合Neo4J图数据库

1.引入依赖 JDK11&#xff0c; neo4J4.4.23 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.15</version><relativePath/> <!-- lookup parent …...

Unity 2018发布在iOS 16.3偶尔出现画面不动的问题

1&#xff09;Unity 2018发布在iOS 16.3偶尔出现画面不动的问题 2&#xff09;IL2CPP在Xcode下增量编译问题 3&#xff09;帧同步实现PuppetMaster布娃娃系统的问题 这是第351篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了UWA问答、社区帖子等…...

蠕虫病毒流量分析案例

背景 某供排水集团的网络管理员对其网络的健康状况持认可态度&#xff0c;表示网络运行正常&#xff0c;没有发现异常行为。然而&#xff0c;由于网络环境变得越来越复杂&#xff0c;仅凭借传统的网络经验已经不能全面了解网络情况。因此&#xff0c;我们为供排水集团安装了Ne…...

别再写死数据了!用QML的ListModel和ListElement动态构建你的UI列表(附WorkerScript多线程实战)

动态数据驱动的QML界面开发实战&#xff1a;从ListModel到多线程优化 在当今快速变化的应用场景中&#xff0c;静态UI已经无法满足用户对实时性和交互性的需求。作为一名QML开发者&#xff0c;你是否遇到过这样的困境&#xff1a;当后台数据频繁更新时&#xff0c;界面出现卡顿…...

QRazyBox终极指南:5步快速修复损坏的二维码

QRazyBox终极指南&#xff1a;5步快速修复损坏的二维码 【免费下载链接】qrazybox QR Code Analysis and Recovery Toolkit 项目地址: https://gitcode.com/gh_mirrors/qr/qrazybox 你是否曾经遇到过无法扫描的二维码&#xff1f;那些因打印模糊、屏幕损坏或污渍覆盖而失…...

OpenCrow:自托管多智能体AI平台的架构解析与实战部署指南

1. 项目概述&#xff1a;一个能自我进化的多智能体AI平台如果你和我一样&#xff0c;对AI智能体的潜力感到兴奋&#xff0c;但又对市面上那些要么功能单一、要么部署复杂的平台感到头疼&#xff0c;那么OpenCrow的出现&#xff0c;可能就是我们一直在等的那个“瑞士军刀”。这不…...

Stack-on-a-budget揭秘:免费调度服务的终极性能对比指南

Stack-on-a-budget揭秘&#xff1a;免费调度服务的终极性能对比指南 【免费下载链接】stack-on-a-budget A collection of services with great free tiers for developers on a budget. Sponsored by Mockoon, the best mock API tool. https://mockoon.com 项目地址: https…...

AI记忆系统健康管理:行为数据驱动的OpenClaw记忆污染解决方案

1. 项目概述&#xff1a;为AI记忆系统装上“听诊器”如果你正在用OpenClaw&#xff0c;或者任何类似的AI智能体开发框架&#xff0c;那你肯定对它的记忆系统又爱又恨。爱的是&#xff0c;它能记住你项目里的关键代码片段、常用指令&#xff0c;下次对话时能直接调出来用&#x…...

马斯克当庭翻脸:刚说完“比特币好“,转身狂喷“其他加密货币都是骗局“

一句法庭证词&#xff0c;炸翻整个币圈2026年4月29日&#xff0c;美国奥克兰法院。埃隆马斯克坐在证人席上&#xff0c;面对一屋子律师和记者&#xff0c;正在为他起诉OpenAI的案件作证。当被问及OpenAI在2018年是否有计划通过首次代币发行&#xff08;ICO&#xff09;筹集资金…...

Cursor AI代码助手:重塑IDE开发体验,从智能补全到项目级协作

1. 项目概述&#xff1a;当AI代码助手遇上IDE&#xff0c;Cursor如何重塑开发体验 如果你是一名开发者&#xff0c;最近一定在圈子里频繁听到“Cursor”这个名字。它不是一个全新的编程语言&#xff0c;也不是一个颠覆性的框架&#xff0c;但它却实实在在地在改变着许多人的编码…...

ARM架构SUB与SUBS减法指令详解

1. ARM减法指令概述在ARM架构中&#xff0c;SUB&#xff08;减法&#xff09;和SUBS&#xff08;带标志位的减法&#xff09;是最基础的算术指令之一。这些指令用于执行寄存器值的减法操作&#xff0c;是构建更复杂算术运算和控制流程的基础。SUB指令从目标寄存器中减去一个立即…...

Skeleton骨架系统:基于Tailwind CSS的现代前端UI架构实践

1. 项目概述&#xff1a;骨架系统在现代前端开发中的价值回归如果你在前端领域摸爬滚打了一段时间&#xff0c;尤其是深度使用过 Tailwind CSS&#xff0c;那么你很可能已经对“组件库”这三个字又爱又恨。爱的是它们能极大提升开发效率&#xff0c;恨的是它们往往伴随着沉重的…...

别再只用AES了!手把手教你用Java BouncyCastle库实现SM4国密加密(附完整工具类)

国密算法实战&#xff1a;用Java BouncyCastle实现SM4加密的完整指南 在数据安全领域&#xff0c;国际通用算法长期占据主导地位&#xff0c;但随着技术自主可控需求的提升&#xff0c;国产密码算法正成为企业级应用的新选择。SM4作为我国商用密码标准体系中的重要对称加密算法…...