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

构建 deno/fresh 的 docker 镜像

众所周知, 最近 docker 镜像的使用又出现了新的困难. 但是不怕, 窝们可以使用曲线救国的方法: 自己制作容器镜像 !

下面以 deno/fresh 举栗, 部署一个简单的应用.

目录

  • 1 创建 deno/fresh 项目
  • 2 构建 docker 镜像
  • 3 部署和测试
  • 4 总结与展望

1 创建 deno/fresh 项目

执行命令:

deno run -A -r https://fresh.deno.dev

初始化 git 仓库并提交:

> cd test-2406
> git init .
已初始化空的 Git 仓库于 /home/s2/test-2406/.git/
> git add .
> git commit -m " test fresh "
[main(根提交) 2e2084b]  test fresh21 files changed, 339 insertions(+)create mode 100644 .gitignorecreate mode 100644 .vscode/extensions.jsoncreate mode 100644 .vscode/settings.jsoncreate mode 100644 .vscode/tailwind.jsoncreate mode 100644 README.mdcreate mode 100644 components/Button.tsxcreate mode 100644 deno.jsoncreate mode 100755 dev.tscreate mode 100644 fresh.config.tscreate mode 100644 fresh.gen.tscreate mode 100644 islands/Counter.tsxcreate mode 100644 main.tscreate mode 100644 routes/_404.tsxcreate mode 100644 routes/_app.tsxcreate mode 100644 routes/api/joke.tscreate mode 100644 routes/greet/[name].tsxcreate mode 100644 routes/index.tsxcreate mode 100644 static/favicon.icocreate mode 100644 static/logo.svgcreate mode 100644 static/styles.csscreate mode 100644 tailwind.config.ts
> git status
位于分支 main
无文件要提交,干净的工作区

2 构建 docker 镜像

创建文件 Dockerfile:

FROM quay.io/jitesoft/alpine:latestARG GIT_REVISION
ENV DENO_DEPLOYMENT_ID=${GIT_REVISION}RUN sed -i 's/ftp.halifax.rwth-aachen.de/mirrors.sjtug.sjtu.edu.cn/g' /etc/apk/repositories
RUN apk update && apk upgrade && apk add curl zstd deno icu-data-full && apk cache cleanWORKDIR /appCOPY . .
RUN deno cache main.ts && deno task buildEXPOSE 8000CMD ["/usr/bin/deno", "run", "-A", "/app/main.ts"]

执行命令:

docker build --build-arg GIT_REVISION=$(git rev-parse HEAD) -t my-app .

构建成功:

> docker images
REPOSITORY                    TAG             IMAGE ID       CREATED              SIZE
my-app                        latest          83173f90cca5   About a minute ago   227MB
quay.io/jitesoft/alpine       latest          c7ecb923af0e   37 hours ago         7.82MB

将构建成功的容器镜像导出为压缩包:

> docker save my-app | zstd > my-app.tar.zst
> ls -lh my-app.tar.zst
-rw-r--r-- 1 s2 s2 77M  6月13日 10:01 my-app.tar.zst

3 部署和测试

将压缩包文件 my-app.tar.zst 复制到要部署的机器, 导入容器镜像:

> docker load < my-app.tar.zst
31e29b5ab918: Loading layer [==================================================>]  3.072kB/3.072kB
c83c49512daf: Loading layer [==================================================>]  145.6MB/145.6MB
ff9964444958: Loading layer [==================================================>]  1.536kB/1.536kB
6389ca351a5d: Loading layer [==================================================>]    171kB/171kB
2ca6496c9f8b: Loading layer [==================================================>]  83.91MB/83.91MB
Loaded image: my-app:latest
> docker images
REPOSITORY                    TAG             IMAGE ID       CREATED         SIZE
my-app                        latest          83173f90cca5   2 minutes ago   227MB

运行容器:

> docker run -it -p 8000:8000 my-app
Using snapshot found at /app/_fresh🍋 Fresh ready  Local: http://localhost:8000/

浏览器打开页面:

在这里插入图片描述

4 总结与展望

容器是一种很好的技术, 开发, 测试, 部署运行都很方便快速.

窝们应该掌握容器镜像的构建方法, 做到更灵活的运行容器, 从而在复杂多变的网络环境中稳定持久运行.


参考资料:

  • https://deno.com/
  • https://fresh.deno.dev/
  • https://quay.io/repository/jitesoft/alpine
  • https://www.alpinelinux.org/
  • https://docs.alpinelinux.org/user-handbook/0.1a/Working/apk.html
  • https://mirror.sjtu.edu.cn/docs/alpine

本文使用 CC-BY-SA 4.0 许可发布.

相关文章:

  • 解锁 LLMs 的“思考”能力:Chain-of-Thought(CoT) 技术推动复杂推理的新发展
  • 数智教育创新如何向未来?腾讯云与你探索革新之路
  • 捋清UITableView展示不同类型数据的差异
  • 聚合分析是Elasticsearch中非常强大的工具
  • nginx 配置2级目录 刷新404
  • 建议收藏!AIGC绘画基础,Midjourney风格码style reference code策展汇总合集
  • 后端项目实战--瑞吉外卖项目软件说明书
  • 升级和维护老旧LabVIEW程序
  • 主动元数据平台详解(下):BIG 十一问,详解定位、对接、血缘保鲜等问题
  • Zookeeper高频面试题整理(入门到精通)
  • 【Mars3d】config.json中的蓝色底图map.basemap = 2017代码实现
  • Jenkins For Windows编译构建C#项目环境搭建(完整版)
  • leetcode168:Excel表列名称
  • Linux函数localtime和time使用整理
  • 动捕技术服务+虚拟人动画制作:让ip形象更自然生动的“动”起来
  • 【Linux系统编程】快速查找errno错误码信息
  • 03Go 类型总结
  • 2017 年终总结 —— 在路上
  • CSS中外联样式表代表的含义
  • Idea+maven+scala构建包并在spark on yarn 运行
  • IndexedDB
  • Laravel深入学习6 - 应用体系结构:解耦事件处理器
  • LintCode 31. partitionArray 数组划分
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • MaxCompute访问TableStore(OTS) 数据
  • mockjs让前端开发独立于后端
  • Object.assign方法不能实现深复制
  • Redis在Web项目中的应用与实践
  • SpringBoot 实战 (三) | 配置文件详解
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Vue ES6 Jade Scss Webpack Gulp
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 后端_MYSQL
  • 日剧·日综资源集合(建议收藏)
  • CMake 入门1/5:基于阿里云 ECS搭建体验环境
  • ​【C语言】长篇详解,字符系列篇3-----strstr,strtok,strerror字符串函数的使用【图文详解​】
  • ​Kaggle X光肺炎检测比赛第二名方案解析 | CVPR 2020 Workshop
  • #DBA杂记1
  • #etcd#安装时出错
  • #大学#套接字
  • ${factoryList }后面有空格不影响
  • ()、[]、{}、(())、[[]]命令替换
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (cos^2 X)的定积分,求积分 ∫sin^2(x) dx
  • (分布式缓存)Redis持久化
  • (剑指Offer)面试题41:和为s的连续正数序列
  • (四)Android布局类型(线性布局LinearLayout)
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)linux下的时间函数使用
  • (转)视频码率,帧率和分辨率的联系与区别
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .NET MVC之AOP
  • .NET 常见的偏门问题
  • .NET/ASP.NETMVC 深入剖析 Model元数据、HtmlHelper、自定义模板、模板的装饰者模式(二)...