日常学习之:如何使用 dockerfile 将 vue 的单独前端项目通过 docker 的方式部署到 heroku上

news2024/12/26 11:12:34

文章目录

  • 需求描述
  • 开始操作
    • 准备阶段:准备 server.js 文件并安装依赖,将 vue 项目包装成单独的服务器
      • 制作 server.js
      • 安装 server.js 需要的依赖
    • 构建 Dockerfile
    • heroku container 链接和部署
    • 其他细节

需求描述

  • 你想用 vue 构建前端,用 django 构建后端,并且你不想用一个服务器来运行整个项目,而是想分开两个服务器部署
  • 通过 heroku 来部署有三种方式
    • 本地项目文件夹直接关联 heroku 远程仓库,push 上去自动开展部署
    • 本地项目文件夹关联 github 远程仓库,github 远程仓库关联 heroku,每次 github push 自动部署
    • 本地项目文件夹直接构建 dockerfile,然后关联 heroku container,通过 heroku container 进行部署
  • 只有前端页面的话是无法部署的,所以准备阶段我们需要再 vue 中加一个 server.js 来将前端项目打包成一个服务器,然后整体部署

开始操作

准备阶段:准备 server.js 文件并安装依赖,将 vue 项目包装成单独的服务器

制作 server.js

.
├── README.md
├── babel.config.js
├── img.png
├── jsconfig.json
├── package-lock.json
├── package.json
├── public
│   ├── favicon.ico
│   └── index.html
├── server.js
├── src
│   ├── App.vue
│   ├── assets
│   ├── components
│   ├── http.js
│   ├── main.js
│   ├── pages
│   └── router
├── todo.md
├── vue.config.js

  • 路径方面需要注意,server.js 是直接放在你的 vue 的根目录底下,也就是最外层
const express = require('express');
const serveStatic = require('serve-static');
const path = require('path');

const app = express();

app.use('/', serveStatic(path.join(__dirname, '/dist')));
// 处理 SPA 的路由回退,确保重定向到 index.html
app.get('*', function (req, res) {
    res.sendFile(path.join(__dirname, '/dist', 'index.html'));
});
const port = process.env.PORT || 16000;
app.listen(port);

console.log('Listening on port: ' + port);

安装 server.js 需要的依赖

  • 这一步是为了将这两个构建服务器需要的 package 写入 package.json,部署的时候方便
npm install express --save
npm install serve-static

构建 Dockerfile

  • 也是在 vue 项目目录的最外层(与 server.js同级),写入如下 Dockerfile
# 第一阶段:构建 =========================================
# 1. 指定平台,因为我本机是 mac 芯片的,而 docker 默认环境是 linux 所以我转换一下平台
# 2. 使用 Node.js 官方镜像作为构建环境, node:14 表示 node 的版本是 14
FROM --platform=linux/amd64 node:14 as build-stage

# 设置工作目录,设置了之后就可以直接使用 . 来表示 docker 中的 /app
WORKDIR /app

# 拷贝 package.json 和 package-lock.json (如果存在)
# COPY A B 是将 A文件夹或者文件拷贝到 B 文件夹或文件,下面命令中第二个位置是 ./ 代表将当前本地目录下 package.json 拷贝到 docker 的工作目录下,相当于 COPY package*.json /app
COPY package*.json ./

# 安装项目依赖
RUN npm install

# 拷贝项目文件和文件夹到工作目录
COPY . .

# 构建应用
RUN npm run build
# ======================================================

# 第二阶段:运行
# 再次使用 Node.js 镜像
FROM --platform=linux/amd64 node:14

# 设置工作目录
WORKDIR /app

# 将构建产物从构建阶段拷贝过来,因为docker 构建是层级结构, 所以相当于从上一层的缓存中 copy 过来
COPY --from=build-stage /app/dist /app/dist
COPY --from=build-stage /app/node_modules /app/node_modules
# 拷贝 server.js 
COPY server.js ./

# 暴露 80 端口
EXPOSE 80

# 启动应用
CMD ["node", "server.js"]

问题:这个项目里面为什么先 COPY package*.json ./ 再 COPY . ., 这两部分似乎可以合并

在 Dockerfile 中,将 COPY package*.json ./COPY . . 分开的原因是为了更有效地利用 Docker 的层级缓存机制。这种做法可以在某些情况下显著提高构建速度,尤其是在进行频繁的构建时。下面是详细解释:

层级缓存机制:

  • 当 Docker 构建镜像时,它会按照 Dockerfile 中的指令逐层构建,并为每一层生成一个缓存。
    如果某一层没有发生变化,Docker 就会重用这一层的缓存,而不是重新构建它。

优化依赖项安装:

  • 通过首先只复制 package.jsonpackage-lock.json 文件,然后运行 npm install,可以确保只有当这些文件发生变化时(即依赖项发生变化),Docker 才会重新安装依赖项。
  • 如果直接复制整个项目目录,那么任何文件的变化都会导致 Docker 无法使用缓存的依赖项层,因此即使只是源代码的一个小改动,也会导致 Docker 需要重新运行 npm install

提高构建效率:
在开发过程中,源代码的变化比依赖项的变化要频繁得多。因此,分开复制可以在大多数构建中避免不必要地重新安装依赖项,从而加快构建速度。
综上所述,尽管从技术上讲,将 COPY package*.json ./COPY . . 合并为一个步骤是可行的,但分开这两个步骤可以更好地利用 Docker 的层级缓存,从而提高构建效率,特别是在频繁的开发和构建过程中。

heroku container 链接和部署

  • 打开 heroku 并登录,create 一个 new app,这一步可以在 heroku 网站或者通过命令行完成
    在这里插入图片描述

  • 找到 deploy,并选择 container registry
    在这里插入图片描述

  • 接下来就是按照步骤执行,需要注意的是,你在 terminal 进行倒数两条命令的时候,一般需要再后面指定你的具体的 heroku app 名称,比如我在 heroku 上创建的 app 叫 alpha 那么我的命令就需要对应的改成

    heroku container:push web -a alpha
    heroku container:release web -a alpha
    

其他细节

  • 如果你需要和后端部署的服务器进行关联,那么请注意你的 vue 项目中链接后端项目的地址一定要对应的改好,注意点包括但不限于下面几点:
    • http -> https 如果后端部署到了服务器上,访问后端 api 的时候,就要使用 https 前缀
    • ws -> wss 对应的,如果建立 websocket 链接,就使用 wss 前缀
      在这里插入图片描述
      在这里插入图片描述
      在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1415857.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

终端录屏神器Asciinema慎用教程

1.效果 2.安装 centos yum install asciinema ubuntu apt-get install asciinema 3.使用 asciinema rec kali.cast #录制文件 asciinema play kali.cast #播放文件 asciinema upload kali.cast #上传文件 详细说明:只使用 asciinema rec 也是可以的,ctrlD结束录屏 4.…

2024年数学建模美赛 分析与编程

2024年数学建模美赛 分析与编程 1、本专栏将在2024年美赛题目公布后,进行深入分析,建议收藏; 2、本专栏对2023年赛题,其它题目分析详见专题讨论; 2023年数学建模美赛A题(A drought stricken plant communi…

尚无忧球馆助教系统源码,助教小程序源码,助教源码,陪练系统源码

特色功能: 不同助教服务类型选择 助教申请,接单,陪练师入住,赚取外快 线下场馆入住 设置自己服务 城市代理 分销商入住 优惠券 技术栈:前端uniapp后端thinkphp 独立全开源

Redis 的二进制安装与包管理安装, 全发行版 Linux 通用

博客原文 文章目录 Redis 简介二进制编译安装获取源码包编译安装移动配置文件到安装目录下配置 redis 为后台启动将 redis 加入到开机启动设置 redis 密码 (可选)修改 bind启动 redis apt 安装更换阿里源(可选)安装 redis修改配置文件 Redis 简介 Redis(全称为Remot…

【Go】Channel底层实现 ②

文章目录 channel底层实现channel发送、接收数据有缓冲 channelchannel 先写再读channel 先读再写(when the receiver comes first) 无缓冲channelchannel存在3种状态: channel底层实现 // channel 类型定义 type hchan struct {// channel 中的元素数量, lenqcoun…

1.26学习总结

连通性判断 DFS连通性判断步骤: 1.从图上任意一点u开始遍历,标记u已经走过 2.递归u的所有符合连通条件的邻居点 3.递归结束,找到了的所有与u的连通点,就是一个连通块 4.然后重复这个步骤找到所有的连通块 BFS连通性判断步骤…

opencv学习二值分析

内容来源于《opencv4应用开发入门、进阶与工程化实践》 二值分析: 常见的二值化方法: 基于全局阈值(threshold)得到的二值图像;基于自适应阈值(adaptiveThreshold)得到的二值图像&#xff1…

RPC教程 7.服务发现与注册中心

0.前言 这一节的内容只能解决只有一个服务的情况。要是有多个服务(即是多个结构体)这种就解决不了,也即是没有服务ip地址和服务实例的映射关系。 1.为什么需要注册中心 在上一节中,客户端想要找到服务实例的ip,需要硬编码把ip写到代码中。…

永磁直驱式风力发电虚拟同步机仿真模型Matlab/Simulink模型

很久没有分享虚拟同步机控制相关的方向了,主要是因为硕士之后,也就没再继续深入研究这个课题了,更多的是在电科院的项目里会接触。这个课题方向其实作为硕士毕业课题还是够用的,相对来说也是比较容易毕业的,因为涉及的…

x-cmd pkg | go - Google 开发的开源编程语言

目录 简介首次用户技术特点竞品分析编译型语言解释型语言JavaWebAssebmly 进一步阅读 简介 Go 语言(或 Golang)是 Google 开发的开源编程语言,诞生于 2006 年。其设计目标是“兼具 Python 等动态语言的开发速度和 C/C 等编译型语言的性能与安…

Nodejs前端学习Day3_准备工作

妈的,这几天真tm冷,前天上午还下了一整天的雪,大雪 文章目录 前言一、Node.js简介1.1何为1.2有什么 二、Node.js可以做什么三、学习路线四、下载nodejs4.1小坑记录4.2LTS和Current版本的不同 五、什么是终端六、在nodejs中执行js代码七、powe…

Python 中的 strip 函数用法,你真的学会了吗?

Python 提供了大量内置函数,使编程变得更加简单。strip 就是这样一个函数。在本文中,我们将探讨 strip 是什么、为什么有用以及如何有效地使用它。 什么是 strip strip 是一种内置方法,用于删除字符串中的前导字符和尾随字符。这些字符可以…

MYSQL库和表的操作(修改字符集和校验规则,备份和恢复数据库及库和表的增删改查)

文章目录 一、MSYQL库的操作1.连接MYSQL2.查看当前数据库3.创建数据库4.字符集和校验规则5.修改数据库6.删除数据库7.备份和恢复8.查看连接 二、表的操作1.创建表2.查看表结构3.修改表4.删除表 一、MSYQL库的操作 1.连接MYSQL 我们使用下面的语句来连接MSYQL: my…

太阳能 LED 恒流电源 升降压原理图 AP9193 大功率升压恒流IC

特别 宽输入电压范围:3.6V~100V 高效率:可高达 95% 工作频率:1MHz CS 限流保护电压:250mV FB 电流采样电压:250mV 芯片供电欠压保护:2.5V 关断时间可调 外置频率补偿脚 应用领域 LED 灯杯 电池供…

docker容器运维命令

文章目录 docker psdocker execdocker inspectdocker topdocker attachdocker waitdocker exportdocker importdocker portdocker cpdocker diffdocker renamedocker statsdocker update总结 docker ps 列出容器。 docker ps [OPTIONS]OPTIONS说明: -a :显示所有的…

FPGA 通过 UDP 以太网传输 JPEG 压缩图片

FPGA 通过 UDP 以太网传输 JPEG 压缩图片 简介 在 FPGA 上实现了 JPEG 压缩和 UDP 以太网传输。从摄像机的输入中获取单个灰度帧,使用 JPEG 标准对其进行压缩,然后通过UDP以太网将其传输到另一个设备(例如计算机),所有…

计算方法实验1:熟悉MATLAB 环境

一、问题描述 熟悉MATLAB 环境。 二、实验目的 了解Matlab 的主要功能,熟悉Matlab 命令窗口及文件管理,Matlab 帮助系统。掌握命令行的输入及编辑,用户目录及搜索路径的配置。了解Matlab 数据的特点,熟悉Matlab 变量的命名规则&a…

如何独立思考?这里有一份全指南

知乎上有一个问题,叫做:为什么我们要独立思考? 排名第一的回答,是凤凰前主笔王路写的,很有意思。他说: 因为别人告诉我们要独立思考。 这个回答非常妙,也非常反讽,有一种「第22条军规…

32GPIO输入&按键控制LED&光敏控制蜂鸣器

一.硬件 光线越强,光敏电阻的阻值越小 温度越高,热敏电阻的阻值就越小 红外光线越强,红外接收管的阻值就越小 类比:电阻阻值越小,上拉或下拉就越强 (弹簧的拉力就越强) 在上下的电阻分压下&a…

Android Studio 提示Use app:drawableStartCompat instead of android:drawableStart

每次提交代码时,AS这个老妈子总爱唠叨一堆warning,这些Warning都在讲什么? 1.Use app:drawableStartCompat instead of android:drawableStart 在Android开发中,android:drawableStart和app:drawableStartCompat是两个用于设置…