前端破圈用Docker开发项目

news2024/11/18 9:40:11

为什么要用 Docker 开发 🤔

直接在系统上开发不香吗?香,但是 Docker 有下面4香

  1. 环境依赖管理:Docker 容器可以管理所有依赖项,例如前端里面的 nodenpm 版本,不需要在本地安装和维护这些依赖项

  2. 隔离:Docker 容器可以隔离应用程序和其运行环境,有助于防止应用程序之间的冲突,也能防止应用程序对主机系统产生意外的更改

  3. 易于分发:任何时候都可以将应用程序分发给其他开发人员或测试人员,因为他们可以在任何其他设备上以相同的方式运行该应用程序,而无需进行任何配置,可以直接使用同一个 docker file 文件构建镜像,也可以拉取私有服务中的 docker image

  4. 状态管理:如果应用程序是无状态的,可以使用 Docker Compose 来创建开发和调试环境,并轻松地在不同的环境中部署应用程序。

整体来看使用 Docker 开发应用程序可以提高开发效率,简化部署和分发过程,同时保证应用程序的运行环境和稳定性。

主要还是遇到了实际问题需要处理😅

遇到的问题

前端开发的项目在本地运行,打包没问题,然后发布到对应的测试环境和线上环境的时候,然后线上打包异常,线上打包使用 DevOps 平台进行的发布,经排查似乎是 Docker 容器中出的问题。

具体场景描述可以看这篇文章 DevOps发版失败,发版仿佛回到了石器时代😣

解决思路

由于没有 DevOps 服务的操作权限,尝试本地安装 Docker 拉取 node 镜像搭建前端环境容器,先在本地 Docker 容器中测试前端项目,如果运行打包都没问题,把本地的 Docker 容器环境导出来,再发给对应有权限的人帮忙到 DevOps 对应的服务器中再次测试

安装Docker

官网下载

官网地址: https://www.docker.com/

本地系统为 Windows11, 直接下载安装对应的 exe 文件即可, 运行后桌面右下角会出现鲸鱼小图标

也可以在 命令提示符Windows PowerShell 里面执行 docker -v 查看否是安装成功,后面所有的命令操作全部是在 Windows PowerShell 中执行的

拉取镜像

前端环境标配 node 环境,有的会搭配 yarn 等其他工具, 这里先拉取一个 node 镜像

docker pull node

镜像默认是从 Docker Hub 上拉取的,默认拉取的是 latest 最新版本,也可以指定 node 版本

docker pull node:<version>

关于 node 官方镜像详细描述,可以查看如下链接

node - Official Image | Docker Hub

注意⚠

如果遇到WSL相关报错,可能需要更新WSL,可以参考如下链接解决

https://learn.microsoft.com/zh-cn/windows/wsl/install-manual#step-4—download-the-linux-kernel-update-package

安装结束后重启系统

协议超时

再次执行 docker pull node,出现报错,提示 net/http: TLS handshake timeout,TLS握手协议超时,可能镜像服务响应太慢在国外导致的

> docker pull node
Using default tag: latest
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout

检查 VPN 的配置,发现是 Rule 模式,调整为 Global 模式,重试,好了

> docker pull node
Using default tag: latest
latest: Pulling from library/node
d52e4f012db1: Pull complete
6e5565e0ba8d: Downloading [====>                                              ]  19.85MB/211MB
...

如果没有装 VPN ,也可以配置镜像加速器解决镜像拉取失败的问题,国内很多云服务商都提供了国内加速器服务

科大镜像:https://docker.mirrors.ustc.edu.cn/

网易:https://hub-mirror.c.163.com/

阿里云:https://<你的ID>.mirror.aliyuncs.com

七牛云:https://reg-mirror.qiniu.com

几分钟后最新版的 node 镜像就下载好了,默认是下载的 latestnode 最新版,对于生产环境来讲这是不稳定的,我们需要控制生产环境的版本,使用 docker pull node:<version> 的方式下载对应的node版本,使用 docker pull node:16.17.0 下载对应版本 node 镜像,和本地系统上的环境保持一致

下载结束后,使用 docker images 命令检查是否镜像下载成功

> docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
node         latest    b098c9ebef91   13 days ago     1.1GB
node         16.17.0   e90654c39524   10 months ago   911MB

创建容器

Windows PowerShell 中的执行 docker run -ti --name node-16.17.0 -p 8080:8080 -v ${pwd}://workspace node:16.17.0 bash 启动命令,创建一个容器

PS D:\Code> docker run -ti --name node-16.17.0 -p 8080:8080 -v ${pwd}://workspace node:16.17.0 bash
root@4f786e914624:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  workspace

注意脚本运行位置

PS D:\Code> 这里是电脑系统里面的代码目录,里面是代码仓库文件

创建交互模式容器

docker run -ti --name <容器名> -p 端口号:端口号 -v ${pwd}://<自定义工作区> <镜像名> bash

命令参数

docker run -ti --name node-16.17.0 -p 8080:8080 -v ${pwd}://workspace node:16.17.0 bash 当前命令各个参数的含义

run: 根据镜像创建并运行一个容器

-ti bash: 输入(交互)模式创建一个容器, 并进入容器bash

--name node-16.17.0: 定义容器名称,这里的容器名称为 node-16.17.0

-v ${pwd}://workspace: 把当前目录目录结构映射到容器中的 workspace 目录下,这里映射的是 D:\Code> 目录下的内容

-p 8080:8080: 端口映射,容器内部的 8080 端口对应外部系统的 8080 端口,因为接下运行的前端项目端口是 8080,如果项目是其他端口,按需修改即可

root@4f786e914624:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  workspace
root@4f786e914624:/# cd workspace
root@4f786e914624:/workspace# ls
vue3-project-01
root@4f786e914624:/workspace/vue3-project-01# ls
README.md  cypress.config.ts  index.html         package.json  src                tsconfig.json       tsconfig.vitest.json  vitest.config.ts
cypress    env.d.ts           package-lock.json  public        tsconfig.app.json  tsconfig.node.json  vite.config.ts

vue3-project-01 是一个 vue3 前端项目,在系统的 D:\Code> 目录下,接下来使用这个项目在容器中安装依赖,运行,打包等操作

项目地址: https://github.com/gywgithub/vue3-project-01

容器中查看环境

查看当前 nodenpm 版本

root@4f786e914624:/# node -v
v16.17.0
root@4f786e914624:/# npm -v
8.15.0

这时候容器中为我们需要的 node 版本, 接下来开始测试项目运行情况

容器中运行前端项目

安装项目依赖

进入 workspace 目录中的 vue3-project-01 前端项目,根目录执行 npm i 命令安装前端依赖

root@4f786e914624:/workspace# cd vue3-project-01/
root@4f786e914624:/workspace/vue3-project-01# npm i

added 612 packages, and audited 613 packages in 4m

...
root@4f786e914624:/workspace/vue3-project-01#

前端项目的依赖包安装完成

运行项目

npm run dev 运行前端项目

root@4f786e914624:/workspace/vue3-project-01# npm run dev

> vue3-project-01@0.0.0 dev
> vite

  VITE v4.3.9  ready in 3573 ms

  ➜  Local:   http://localhost:8080/

运行成功了,浏览器访问如下效果,到这里就可以在容器中开发前端项目了

注意⚠

如果出现在容器中项目运行成功,但是在页面上无法访问的情况,需要检查创建容器时端口是否正确映射以及端口是否被防火墙拦截

打包项目

npm run build 打包前端项目,也正常没有报错,也正确生成了 dist 文件

root@4f786e914624:/workspace/vue3-project-01# npm run build
...
✓ built in 2.32s
root@59e1b6a61772:/workspace/vue3-project-01# ls
README.md  cypress.config.ts  env.d.ts    node_modules       package.json  src                tsconfig.json       tsconfig.vitest.json  vitest.config.ts
cypress    dist               index.html  package-lock.json  public        tsconfig.app.json  tsconfig.node.json  vite.config.ts

总结回顾

目前来看,使用 vue3-project-01 这个前端项目在 Docker 中开发所有模式都没问题。回到最初的目的,使用 Docker 也是排查公司的项目在 DevOps 中打包失败的原因,那么按照这个流程模式,把出问题的项目地址和端口重新创建对应的容器,然后在容器中进行复现对应的问题点就行了

欢迎大家讨论交流,如果文章感觉有用,随手点个赞再走呗 ^_^ 🥰🥰

微信公众号:草帽Lufei

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

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

相关文章

【WEEK14】 【DAY2】Shiro第七部分【中文版】

2024.5.28 Tuesday 接上文【WEEK14】 【DAY1】Shiro第六部分【中文版】 目录 15.8.Shiro整合Thymeleaf15.8.1.修改pom.xml添加依赖15.8.1.1.shiro-thymeleaf整合包导入15.8.1.2.当前完整的pom文件 15.8.2.修改ShiroConfig.java15.8.3.修改index.html15.8.4.给root用户开放所有权…

Java 构造方法的作用以及如何重载构造方法

Java是一种面向对象的编程语言&#xff0c;其中对象是核心概念之一。每个对象都由类创建&#xff0c;而类是对象的蓝图。为了创建和初始化对象&#xff0c;Java引入了构造方法&#xff08;Constructors&#xff09;。 构造方法的作用 构造方法是与类同名的特殊方法&#xff0…

代理注册湖北武汉投资管理公司流程和条件

我公司代理注册湖北武汉投资管理公司&#xff0c;现在大家都知道全国的投资管理公司已经停批了&#xff0c;很多需要收购的老板都是通过收购现成的投资管理公司经营的&#xff0c;现在我告诉大家一个好消息&#xff0c;我们有渠道办理湖北武汉资产管理公司&#xff0c;详情致电…

《Intel开发手册卷3》读书笔记3

1、中断和异常的概述 中断和异常是强制性的执行流的转移&#xff0c;从当前正在执行的程序或任务转移到一个特殊的称作句柄的例程或任务。当硬件发出信号时&#xff0c;便产生中断&#xff0c;中断的产生同正在执行的程序是异步的&#xff0c;即中断的产生是随机的。其用于处理…

【YOLOv10】使用yolov10训练自己的数据集/验证 /推理 /导出模型/ONNX模型的使用

YOLOv10: 实时端到端的目标检测。 性能 YOLOv10比最先进的YOLOv9延迟时间更低&#xff0c;测试结果可以与YOLOv9媲美&#xff0c;可能会成为YOLO系列模型部署的“新选择”。 目录 1 数据准备 2 配置文件 3 训练 4 验证 5 预测 6 导出模型 7 ONNX模型的使用 官方论文地址…

AI新时代——【深度学习】驱动的【AIGC大模型】与【机器学习】的创新融合

目录 1.机器学习与人工智能的基础 1.机器学习的基本原理 2.人工智能的广泛应用 2.深度学习的崛起 1.深度学习的概念和原理 2.卷积神经网络&#xff08;CNN&#xff09; 3.循环神经网络&#xff08;RNN&#xff09; 3.AIGC大模型的创新 1.AIGC的概念和应用 2.代表性AI…

【手把手带你微调 Llama3】 改变大模型的自我认知,单卡就能训

微调Llama3的自我认知后 当你问Llama3中文问题&#xff1a; “你叫什么名字&#xff1f;”、 “做个自我介绍”、 “你好” Llama3 会用中文回答 &#xff1a; “我是AI在手” &#xff08;如下图&#xff09; 1、环境安装 # nvidia 显卡 显存16G# pytorch 2.2.2 …

【全球展会招商】2025COSP深圳国际户外展乘风而至,启赴新程!

展会介绍 “2025-COSP深圳国际户外展览会”将于展出面积达40,000㎡&#xff0c;展出品牌60家包含户外露营展区、 车旅生活展区 、户外运动展区、水上运动展区 、 民宿旅居展区等热门产品专区&#xff0c;充分满足供应商及采购商、行业人士及运动爱好者的需求&#xff0c;打造展…

【LORA协议栈】工作记录

一、硬件资源 MCU型号&#xff1a;STM32F401xE。Lora芯片&#xff1a;SX1276。硬件看门狗。ATT7022E三相电能专用计量芯片。 二、功能简介 作为一个组件&#xff0c;通过485与网关或者各种子设备连接在一起。支持boot升级。通过SPI与LORA芯片通信。接收和发送数据。有3路通信…

优思学院:什么是DMADV模式?和DMAIC有何区别?

在现代企业管理中&#xff0c;质量管理是一项至关重要的工作。六西格玛管理法作为一种高效的质量管理方法&#xff0c;已在全球范围内得到了广泛应用。它不仅在制造业中发挥了巨大的作用&#xff0c;在服务业和其他行业中也同样表现出了强大的生命力。六西格玛管理法主要有两种…

【学习】软件测试小伙伴,这几点助你提升软件测试水平

在数字化时代&#xff0c;软件已经无处不在&#xff0c;影响着我们的日常生活、工作乃至整个社会的运行。在这个背景下&#xff0c;软件测试成为确保产品质量的关键环节&#xff0c;关乎用户体验和社会信任。本文将为您梳理一些关于软件测试你必须了解的知识点&#xff0c;并阐…

联邦学习(一)

世界第一本“联邦学习”专著——《联邦学习》。作者阅读数书籍《联邦学习实战》。 1.联邦学习概述 在构件全局模型时,其效果与数据被整合在一起进行集中式训练的效果几乎一致,这便是联邦学习提出的动机和核心思想。 核心理念:数据不动模型动,数据可用不可见。 传统训练范式…

CCF CAT- 全国算法精英大赛(2024第二场)往届真题练习 4 | 珂学家

前言 餐馆 思路&#xff1a;可撤销的0-1背包 考察了多个知识点&#xff0c;包括 差分技巧离线思路0-1背包 不过这题卡语言&#xff0c;尤其卡python import java.io.*; import java.util.*; import java.util.stream.Collectors; import java.util.stream.IntStream;public…

Java实现异步的4种方式

文章目录 异步1、Future与Callable2. CompletableFuture3. Spring框架的异步支持3.1 启动类开启对Async的支持 EnableAsync3.2 配置自定义线程池3.3 异步业务3.4 调用异步业务方法 4. 使用消息队列4.1 安装RabbitMq4.2 使用4.3 MQ消息丢失以及重复消费问题 5、总结 异步 异步&…

vue3 调用本地exe

1、注册表注册 在注册表中直接按照图2注册数据&#xff1b;也可以按照图3注册表的文件创建文档&#xff0c;然后点击打开&#xff0c;将会将注册表写入window系统。 图2 Windows Registry Editor Version 5.00 [HKEY_CLASSES_ROOT\F1] "URL:F1 Protocol Handler" &q…

Ansible03-Ansible Playbook剧本详解

目录 写在前面5. Ansible Playbook 剧本5.1 YAML语法5.1.1 语法规定5.1.2 示例5.1.3 YAML数据类型 5.2 Playbook组件5.3 Playbook 案例5.3.1 Playbook语句5.3.2 Playbook1 分发hosts文件5.3.3 Playbook2 分发软件包&#xff0c;安装软件包&#xff0c;启动服务5.3.3.1 任务拆解…

通过ESP32芯片模组实现产品智能化升级,启明云端乐鑫代理商

随着科技的不断进步&#xff0c;物联网&#xff08;IoT&#xff09;已经渗透到我们生活的方方面面&#xff0c;成为现代生活不可或缺的一部分。在这场智能化革命中&#xff0c;乐鑫科技以其创新的ESP32芯片模组&#xff0c;为智能家居和智能设备的发展注入了新的活力。作为乐鑫…

一次绕过waf进行xss的经历

今天室友遇到一个好玩的网站&#xff0c;下面是一些尝试绕过Waf进行XSS的记录。首先该网站没有对左右尖号和单双引号做任何过滤或转义。且有未知的waf或者其他阻止恶意访问的手段。 首先我的访问为 login.asp?f1 时候&#xff0c;页面关键源码为 可能是表示登录次数的一个东西…

简单模拟实现shell(Linux)

目录​​​​​​​ 前言 展示效果 实现代码 前言 该代码模拟了shell的实现&#xff0c;也就是解析类似于“ls -a -l"的命令&#xff0c;当我们启动我们自己写的shell的可执行程序时&#xff0c;我们输入"ls"的命令&#xff0c;也可以展示出在shell中输入&…

广告联盟收款的解决方案

目前国内的affiliate&#xff0c;收海外联盟款就六种主要的解决方案(使用何种方式收款&#xff0c;不是我们决定的&#xff0c;是你操作的联盟决定的&#xff0c;你要根据联盟的要求提供相应的收款方式) 1 直接注册国外当地的银行账户 比如我收美国的广告联盟佣金用的是我美国银…