如何构建并发布自己的docker镜像

最近想在云服务器上部署一个自己的 nginx 服务,通过docker 部署最方便。之前也发布过自己的docker镜像,但是时间长了老是忘记具体的命令是啥,这里做一个笔记记录下。

构建镜像

docker cli 提供了两个命令来完成构建\发布:

1
2
docker build # 构建镜像
docker pull/push # 拉取/推送镜像

整体流程参考下图:

docker构建发布流程

docker build 构建镜像

首先命令格式来自文档

1
docker build [OPTIONS] PATH | URL | -

docker build是利用 Dockerfile 内的指令来构建镜像。通常我们会把 Dockerfile 也加入版本管理,所以对镜像的修改操作也会有记录,这相比 docker commit的黑箱操作好很多。Dockerfile 就不细讲了。

阅读全文

编译并运行 Chrome Devtools Frontend

Chrome DevTools 工作原理简单介绍

Devtools 不只是我们在浏览器中按F12所打开的调试界面,它是 Chromium 的一部分,在 Electron 中也有集成。

Devtools 主要由四部分组成:

  • Frontend: 调试器前端,默认由 Chromium 内核层集成,DevTools Frontend 是一个 Web 应用程序,就是 JS + CSS + HTML 组成的;
  • Backend: 调试器后端,广义上主要由 Chromium、V8 或 Node.js(v8)提供,用来与 Frontend 连接与通信;
  • Protocol: 通信协议,调试器前端和后端通过此协议通信,协议遵循 JSON RPC2.0 规范;
  • Connection: 连接层,目前有 WebSocketConnectionStubConnectionMainConnection 三种连接方式,查看其他资料,也有说是消息通道,即 Embedder Channel、WebSocket Channel、Chrome Extensions Channel、USB/ADB Channel,但是我在当前的版本没有找到这部分代码;

devtools 图示

阅读全文

使用 ChromeRemoteInterface 调试 nodejs 代码

最近在调研如何远程调试一个 nodejs 进程,大致调研路径是 Chome DevTolls -> Chrome debugging protocol -> chrome-remote-interface,本文重点介绍下 chrome-remote-interface 的简单使用。

根据其文档,这个工具主要是提供一个 js api,在连接到对应的服务端(要调试的端)后,通过 Chrome Debugging Protocol 与之交互。

所以其基本的使用分为以下几个步骤:

  • 启动 nodejs 实例,并打开调试模式, eg. node --inspect-brk=9222 for-insepct.js
  • 通过 CDP 连接到远程调试实例
  • 通过 CDP Client 操作远程调试实例

阅读全文

使用 babel 实现一个自创的 js 语法

用 babel 实现用 @!标记一个函数时,将为函数自动加上调用日志打印的功能

1
2
3
4
5
6
// 如
function @! foo() {}
// 转化为
function foo() {
console.log('function name:', 'foo', 'date:', Date.now())
}

阅读全文

babel 的原理及插件的编写(简要)

由浅入深,先从几个简单的插件的编写开始吧

(本次分析的 babel 版本为 7.20.4)

阅读全文

初步安装 knative

参考资料:
https://knative.dev/docs/getting-started/quickstart-install/#before-you-begin

注意,由于我在虚拟机里走了vpn代理,所以以下命令都没有使用国内源。

前提条件:

  1. 安装了 minikube、kubectl,参考 在 vmware centos7 中安装 minikube.

阅读全文

在 vmware centos7 中安装与探索 k8s

参考资料:
https://minikube.sigs.k8s.io/docs/start/
https://docs.docker.com/engine/install/centos/#install-using-the-convenience-script
https://www.cnblogs.com/yyee/p/15071684.html

注意,由于我在虚拟机里走了vpn代理,所以以下命令都没有使用国内源。

阅读全文

flutter中通过ffi使用quickjs

  • quickjs中 判断 JSValue 的类型

    quickjs.h 中 搜索 JS_Is开头的方法:

    • JS_IsBool(JSValue)
    • JS_IsNull
    • JS_IsUndefined
    • JS_IsNumber
    • JS_IsString
    • JS_IsObject
    • JS_IsException

阅读全文

web前端Proxy沙箱实现时需注意RegExp等原生对象问题

问题起因

起因是一个前端js沙箱的实现中,发现通过沙箱执行代码中访问 RegExp.$n 的值一直是空字符串,类似于:

1
2
3
4
5
const code = `
const r = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/
r.exec('2022-08-31')
return RegExp.$1;`;
evalScriptInSandbox(code);

阅读全文

记 RegExp 字面量形式在 eval 及 new Function里的行为异常问题

首先看一下最简单的代码

1
2
3
const r = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
r.exec('2019-10-08');
console.log(RegExp.$1); // 2019

上面这段代码在 Chrome console 中执行结果为 2019,一切正常。

1
2
3
4
5
eval(`
const r = /^(\d{4})-(\d{1,2})-(\d{1,2})$/;
r.exec('2019-10-08');
RegExp.$1;
`); // ''

重新打开一个 Chrome console, 然后执行上面这段代码,结果为空字符串, 经过查阅资料,发现在 eval 中执行 regx的字面量时,需要额外转义反斜线,即:

1
2
3
4
5
eval(`
const r = /^(\\d{4})-(\\d{1,2})-(\\d{1,2})$/;
r.exec('2019-10-08');
RegExp.$1;
`); // '2019'

阅读全文