构建 deno/fresh 的 docker 镜像

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

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

目录

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

1 创建 deno/fresh 项目

执行命令:

sh 复制代码
deno run -A -r https://fresh.deno.dev

初始化 git 仓库并提交:

sh 复制代码
> cd test-2406
> git init .
已初始化空的 Git 仓库于 /home/s2/test-2406/.git/
> git add .
> git commit -m " test fresh "
[main(根提交) 2e2084b]  test fresh
 21 files changed, 339 insertions(+)
 create mode 100644 .gitignore
 create mode 100644 .vscode/extensions.json
 create mode 100644 .vscode/settings.json
 create mode 100644 .vscode/tailwind.json
 create mode 100644 README.md
 create mode 100644 components/Button.tsx
 create mode 100644 deno.json
 create mode 100755 dev.ts
 create mode 100644 fresh.config.ts
 create mode 100644 fresh.gen.ts
 create mode 100644 islands/Counter.tsx
 create mode 100644 main.ts
 create mode 100644 routes/_404.tsx
 create mode 100644 routes/_app.tsx
 create mode 100644 routes/api/joke.ts
 create mode 100644 routes/greet/[name].tsx
 create mode 100644 routes/index.tsx
 create mode 100644 static/favicon.ico
 create mode 100644 static/logo.svg
 create mode 100644 static/styles.css
 create mode 100644 tailwind.config.ts
> git status
位于分支 main
无文件要提交,干净的工作区

2 构建 docker 镜像

创建文件 Dockerfile:

sh 复制代码
FROM quay.io/jitesoft/alpine:latest

ARG 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 clean

WORKDIR /app

COPY . .
RUN deno cache main.ts && deno task build

EXPOSE 8000

CMD ["/usr/bin/deno", "run", "-A", "/app/main.ts"]

执行命令:

sh 复制代码
docker build --build-arg GIT_REVISION=$(git rev-parse HEAD) -t my-app .

构建成功:

sh 复制代码
> 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

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

sh 复制代码
> 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 复制到要部署的机器, 导入容器镜像:

sh 复制代码
> 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

运行容器:

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

浏览器打开页面:

4 总结与展望

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

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


参考资料:


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

相关推荐
虎头金猫7 小时前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
分布式存储与RustFS8 小时前
MinIO 官方 Docker 镜像被移除:依赖它的项目该怎么办
docker·云原生·devops·对象存储·minio·分布式存储
玉&心10 小时前
通过Arthas在线诊断K8S中的内存及JVM等使用情况
docker·k8s·arthas
xing-xing10 小时前
Docker容器中Nginx站点根目录网页配置访问
nginx·docker
赵文宇(温玉)10 小时前
CoreDNS的hosts插件的缺行配置导致k8s集群异常
容器·kubernetes·rancher
guo_wen_qiang10 小时前
上传本地镜像到harbor中
docker·容器·持续部署
羑悻的小杀马特11 小时前
Dockerfile 全景指南:从入门编写dockerfile到生产环境镜像优化实战,一步步带你从啃透制作指令到镜像制作落地!
docker·dockerfile·镜像制作
BianHuanShiZhe11 小时前
docker常见命令
docker
正经教主13 小时前
【FDE系列】阶段2:Day 43:Docker Compose — 多容器一键编排
人工智能·docker·fde
忆~遂愿13 小时前
本地片库怎么在外面打开?Plex + cpolar 搭一套可远程访问的私人影音库
docker·容器