从封装 Nginx NJS 工具镜像聊起

2024-01-24 11:18

本文主要是介绍从封装 Nginx NJS 工具镜像聊起,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从封装 Nginx NJS 工具镜像聊起

最近发现有不少需求可以通过 Nginx JavaScript (NJS)来完成,相比较运行一套完整的 Web 服务来说,轻量高效的方案总是惹人喜爱,更何况这套方案是由 Nginx 官方团队推出,并搭上了繁荣的 JavaScript 生态。

本篇文章先从 NJS 容器封装、以及容器镜像优化来聊聊。

写在前面

NJS 目前还处于相对早期的版本,截止本篇文章发布,官方最新的版本是 0.5.0,官网并没有二进制文件可以下载,软件随 Nginx 应用的各版本软件包提供,目前并未独立提供。

不过为了更方便的进行脚本调试,能够使用显式声明的使用 NJS 的运行时,我创建了一个开源项目,包含了 NJS 目前的主要版本的容器镜像:https://github.com/soulteary/docker-njs。

相比较官方镜像动辄 20MB 来说,最小的版本不到 1MB,更小的尺寸带来的是更轻量和快速的体验。如果你想获取最新的镜像,可以访问 DockerHub 官方仓库。

下面来聊聊如何针对 NJS 进行镜像封装以及过程中的一些思考。

基于官方镜像进行镜像构建

构建 NJS 镜像的最简单的方式是从官方容器中直接提取我们所需要的可执行文件。况且,相对于自行编译,官方构建产物更让人用的放心一些。

通过分析发现 NJS 依赖 libpcrelibeditlibncursesw,所以除了将 njsbin 文件提取之外,还需要将上述依赖库进行拷贝 。

以最新版本的 NJS 封装为例:

FROM nginx:1.19.6-alpine AS builderFROM alpine:3.12
COPY --from=builder /usr/bin/njs /usr/bin/njs
COPY --from=builder /usr/lib/libpcre.so.1.2.12 \/usr/lib/libedit.so.0.0.63 \/usr/lib/libncursesw.so.6.2 \/usr/lib/
RUN ln -sf /usr/lib/libpcre.so.1.2.12 /usr/lib/libpcre.so.1 && \ln -sf /usr/lib/libedit.so.0.0.63 /usr/lib/libedit.so.0 && \ln -sf /usr/lib/libncursesw.so.6.2 /usr/lib/libncursesw.so.6ENTRYPOINT [ "njs" ]

这样一个基础的 NJS 镜像就构建好了。

针对不同版本进行构建

常常使用容器的小伙伴都知道 Nginx 官方提供了 Alpine / Debian 两个版本的镜像,而 NJS 目前也有三个小版本:0.3.x / 0.4.x 以及最新的 0.5.x,而这几个版本对于上述依赖库的版本、以及基础 Nginx 依赖都略有不同。

为了减少代码重复,以及提高代码可维护性,可以将不同版本的依赖单独声明为 .env 配置文件,然后搭配一个抽象度比较高的容器配置文件,对多个版本进行构建。以0.5.0 的 NJS 为例:

DIST_OS=debian:10
NGX_VER=1.19.6
PCRE_VER=1.2.12
EDIT_VER=0.0.63
CURSESW_VER=6.2

将上面的文件保存为 .env 保存至 njs/0.5.0/.env,接着开始编写 Dockerfile:

ARG DIST_OS=alpine:3.12
ARG NGX_VER=1.19.6-alpineFROM "nginx:$NGX_VER" AS builderFROM "$DIST_OS"
COPY --from=builder /usr/bin/njs /usr/bin/njs
COPY --from=builder /usr/lib/libpcre.so.* \/usr/lib/libedit.so.* \/usr/lib/libncursesw.so.* \/usr/lib/
RUN ls /usr/lib/libpcre.so.*.* | xargs -I {} ln -sf {} $(echo {} | cut -b 1-21) && \ls /usr/lib/libedit.so.*.* | xargs -I {} ln -sf {} $(echo {} | cut -b 1-21) && \ls /usr/lib/libncursesw.so.*.* | xargs -I {} ln -sf {} $(echo {} | cut -b 1-25)ENTRYPOINT [ "njs" ]

其他几个版本也可以如法炮制,最终整个项目结构如下:

├── Dockerfile
├── LICENSE
├── README.md
├── docker-build.sh
├── docker-slim.sh
└── njs├── 0.3.9├── 0.3.9-alpine├── 0.4.4├── 0.4.4-alpine├── 0.5.0└── 0.5.0-alpine

为了能够自动化的构建各个版本的 NJS 镜像,我们需要编写一个 BASH 脚本:

#!/bin/bashRELEASE_DIR='./njs';
REPO_NAME='soulteary/docker-njs'for njs_ver in $RELEASE_DIR/*; dotag=$(echo $njs_ver | cut -b 7-);echo "Build: $tag";set -a. "$njs_ver/.env"set +adocker build --build-arg DIST_OS=$DIST_OS --build-arg NGX_VER=$NGX_VER --build-arg PCRE_VER=$PCRE_VER --build-arg EDIT_VER=$EDIT_VER --build-arg CURSESW_VER=$CURSESW_VER --tag $REPO_NAME:$tag .
done

将上面的内容保存为 make-image.sh,然后执行它之后就能得到各个版本的镜像了。

REPOSITORY      TAG              IMAGE ID       CREATED         SIZE
njs             0.5.0-alpine     0f6e379160a1   About a minute ago    8.07MB
njs             0.5.0            80071066f7ca   About a minute ago    115MB
njs             0.4.4-alpine     5b9fb7872be3   About a minute ago    8.06MB
njs             0.4.4            d6663992a6ec   About a minute ago    115MB
njs             0.3.9-alpine     155e2a710c02   About a minute ago    7.97MB
njs             0.3.9            7a041ccd4f86   About a minute ago    101MB

使用 docker-slim 优化镜像尺寸

上文构建完毕的镜像尺寸略大了一些,可以借助 Docker Slim 进行精简。下载Docker Slim 后,使用命令对原有镜像进行二次构建,即可构建出新的小巧的镜像:

docker-slim build --target soulteary/njs:0.5.0 --tag soulteary/njs:0.5.0-slim --http-probe=false

为了减少后续维护成本,我们可以和之前构建不同版本 NJS 一样,准备一个 slim.sh 脚本,简化后续操作:

#!/bin/bashRELEASE_DIR='./njs';
REPO_NAME='soulteary/docker-njs'for njs_ver in $RELEASE_DIR/*; dotag=$(echo $njs_ver | cut -b 7-);echo "Build: $tag";set -a. "$njs_ver/.env"set +adocker-slim build --target $REPO_NAME:$tag --tag $REPO_NAME:$tag-slim --http-probe=false
done

脚本执行完毕,可以看到本地镜像尺寸有了大幅的减少,如果我们推送到 DockerHub,官方镜像仓库会对镜像进一步压缩,最终最小的镜像尺寸会在 1MB 以内,非常利于快速启动,进行调试。

REPOSITORY      TAG                 IMAGE ID       CREATED              SIZE
njs             0.5.0-alpine-slim   9cd49bb22a26   About a minute ago   2.17MB
njs             0.5.0-slim          766a3f6ef92b   About a minute ago   2.96MB
njs             0.4.4-alpine-slim   2f401dee2bd6   About a minute ago   2.16MB
njs             0.4.4-slim          d62a8af54253   About a minute ago   2.96MB
njs             0.3.9-alpine-slim   5dc7a6799f66   About a minute ago   2.03MB
njs             0.3.9-slim          32b0ec660c4b   About a minute ago   2.28MB

生成批量推送镜像脚本

一次性生成多个镜像之后,如果是手动推送到 DockerHub 其实挺繁琐的,这个时候可以使用Docker Image 命令 来“偷懒”:

docker images soulteary/docker-njs --format "docker push {{.Repository}}:{{.Tag}}"

使用格式参数,可以快速生成带 docker push 的命令,然后不论是在命令行中通过管道符执行,还是保存为文件执行,都可以做到批量推送镜像啦:

docker push soulteary/docker-njs:0.5.0-alpine-slim
docker push soulteary/docker-njs:0.5.0-slim
docker push soulteary/docker-njs:0.5.0-alpine
docker push soulteary/docker-njs:0.5.0

其他

Nginx 在去年十二月发布了主线版本的例行更新,版本升级到了 1.19.6,官方对于本次升级只有聊聊数语,未曾提到 NJS 相关的事情:

Changes with nginx 1.19.6                                        15 Dec 2020*) Bugfix: "no live upstreams" errors if a "server" inside "upstream"block was marked as "down".*) Bugfix: a segmentation fault might occur in a worker process if HTTPSwas used; the bug had appeared in 1.19.5.*) Bugfix: nginx returned the 400 response on requests like"GET http://example.com?args HTTP/1.0".*) Bugfix: in the ngx_http_flv_module and ngx_http_mp4_module.Thanks to Chris Newton.

但是因为折腾 NJS 运行时镜像,发现了这个隐藏在主版本更新日志外的变更,发现了这个时隔三个月大量更新的 0.5.0。

最后

我创建了一个名为 njs-learning-materials 的开源仓库,目前已经整理了 NJS 相关的一些开源参考资料,后续会随着更深入的折腾,不断更新和补充内容。

如果你感兴趣的话,欢迎加入我一起折腾。

–EOF


我现在有一个小小的折腾群,里面聚集了一些喜欢折腾的小伙伴。

在不发广告的情况下,我们在里面会一起聊聊软件、HomeLab、编程上的一些问题,也会在群里不定期的分享一些技术沙龙的资料。

喜欢折腾的小伙伴欢迎扫码添加好友。(请注明来源和目的、实名入群,否则不会通过审核)

关于折腾群入群的那些事


本文使用「署名 4.0 国际 (CC BY 4.0)」许可协议,欢迎转载、或重新修改使用,但需要注明来源。 署名 4.0 国际 (CC BY 4.0)

本文作者: 苏洋

创建时间: 2021年01月10日
统计字数: 5051字
阅读时间: 11分钟阅读
本文链接: https://soulteary.com/2021/01/10/let-us-start-with-the-mirroring-of-the-nginx-njs-tool-package.html

这篇关于从封装 Nginx NJS 工具镜像聊起的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/639518

相关文章

centos7基于keepalived+nginx部署k8s1.26.0高可用集群

《centos7基于keepalived+nginx部署k8s1.26.0高可用集群》Kubernetes是一个开源的容器编排平台,用于自动化地部署、扩展和管理容器化应用程序,在生产环境中,为了确保集... 目录一、初始化(所有节点都执行)二、安装containerd(所有节点都执行)三、安装docker-

使用Nginx来共享文件的详细教程

《使用Nginx来共享文件的详细教程》有时我们想共享电脑上的某些文件,一个比较方便的做法是,开一个HTTP服务,指向文件所在的目录,这次我们用nginx来实现这个需求,本文将通过代码示例一步步教你使用... 在本教程中,我们将向您展示如何使用开源 Web 服务器 Nginx 设置文件共享服务器步骤 0 —

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

一文带你搞懂Nginx中的配置文件

《一文带你搞懂Nginx中的配置文件》Nginx(发音为“engine-x”)是一款高性能的Web服务器、反向代理服务器和负载均衡器,广泛应用于全球各类网站和应用中,下面就跟随小编一起来了解下如何... 目录摘要一、Nginx 配置文件结构概述二、全局配置(Global Configuration)1. w

使用Python制作一个PDF批量加密工具

《使用Python制作一个PDF批量加密工具》PDF批量加密‌是一种保护PDF文件安全性的方法,通过为多个PDF文件设置相同的密码,防止未经授权的用户访问这些文件,下面我们来看看如何使用Python制... 目录1.简介2.运行效果3.相关源码1.简介一个python写的PDF批量加密工具。PDF批量加密

使用Java编写一个文件批量重命名工具

《使用Java编写一个文件批量重命名工具》这篇文章主要为大家详细介绍了如何使用Java编写一个文件批量重命名工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录背景处理1. 文件夹检查与遍历2. 批量重命名3. 输出配置代码片段完整代码背景在开发移动应用时,UI设计通常会提供不

若依部署Nginx和Tomcat全过程

《若依部署Nginx和Tomcat全过程》文章总结了两种部署方法:Nginx部署和Tomcat部署,Nginx部署包括打包、将dist文件拉到指定目录、配置nginx.conf等步骤,Tomcat部署... 目录Nginx部署后端部署Tomcat部署出现问题:点击刷新404总结Nginx部署第一步:打包

Nginx、Tomcat等项目部署问题以及解决流程

《Nginx、Tomcat等项目部署问题以及解决流程》本文总结了项目部署中常见的four类问题及其解决方法:Nginx未按预期显示结果、端口未开启、日志分析的重要性以及开发环境与生产环境运行结果不一致... 目录前言1. Nginx部署后未按预期显示结果1.1 查看Nginx的启动情况1.2 解决启动失败的

tomcat在nginx中的配置方式

《tomcat在nginx中的配置方式》文章介绍了如何在Linux系统上安装和配置Tomcat,并通过Nginx进行代理,首先,下载并解压Tomcat压缩包,然后启动Tomcat并查看日志,接着,配置... 目录一、下载安装tomcat二、启动tomcat三、配置nginx总结提示:文章写完后,目录可以自动

Python按条件批量删除TXT文件行工具

《Python按条件批量删除TXT文件行工具》这篇文章主要为大家详细介绍了Python如何实现按条件批量删除TXT文件中行的工具,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.简介2.运行效果3.相关源码1.简介一个由python编写android的可根据TXT文件按条件批