Ruby 一条命令将 ruby 脚本打包成可执行文件,运行在轻量容器运行时中

weiwenhao · 2023年09月25日 · 最后由 sigavij325 回复于 2024年05月07日 · 980 次阅读

当然不止是 ruby,其他的脚本语言比如 python/php 等都可以通过类似的方式进行打包。

仓库地址:https://github.com/weiwenhao/parker 欢迎 watch/start,让该项目有机会出现在 github trending 上得到更多的关注 ~

⚙️ 安装

github releases 中下载并解压 Parker 安装包。推荐将解压后的 parker 文件夹移动到/usr/local/下,并将/usr/local/parker/bin目录加入到系统环境变量。

> parker --version
0.0.1

📦 使用

cd 到工作目录,执行 parker :target 该命令将 :target 连同当前的工作目录一起打包成一个 :target-c 可执行文件,将可执行文件放到目标机器上运行即可。

> cd :workdir && parker :target

示例

上面的可执行文件 + 资源文件打包是标准使用示例,当然也有一些非标准的使用方式,比如以一个 ruby 编写的 server 为例子

> tree .
.
├── ruby  # cp /usr/bin/ruby ./ruby
└── server.rb

0 directories, 2 files

server.rb 内容如下

require 'webrick'

server = WEBrick::HTTPServer.new(Port: 8000)

server.mount_proc '/' do |req, res|
  res.body = 'Hello, World!'
end

trap 'INT' do
  server.shutdown
end

server.start

cd 到工作目录中执行 parker ruby,你将会得到一个 ruby-c 文件,这就是打包好的可执行文件,将其上传到目标机器中执行即可。下面是在目标机器上执行的示例,可以看到此时只有 ruby-c 文件,而没有 server.ruby 啦

> > parker ruby
ruby-c
├── server.ruby
└── ruby
🍻 parker successful

------------------------------------------------------------------------ move ruby-c to target
> tree .
.
└── ruby-c

0 directories, 1 file

------------------------------------------------------------------------ run ruby-c
> ./ruby-c $PWD/hello.rb # 由于 ruby 对 mount namespace 支持不全,所以这里需要使用绝对路径。
[2023-09-25 15:44:43] INFO  WEBrick 1.7.0
[2023-09-25 15:44:43] INFO  ruby 3.0.2 (2021-07-07) [x86_64-linux-gnu]
[2023-09-25 15:44:43] INFO  WEBrick::HTTPServer#start: pid=3231 port=8000

此处 ruby-c 会将参数传递给 ruby 进程。

❗️ parker 不解决 ruby 的动态编译问题。

🚢 运行说明

ruby-c 是 parker 构建的轻量级容器运行时,并且 ruby-c 是一个静态编译的可执行文件。其在执行时通过 linux namespace 创建了一个隔离环境,并解压工作目录运行目标 ruby。

ruby-c 将监听 ruby 主进程的运行,一旦 ruby 进程停止或异常,ruby-c 会通过 cgroup 清理容器环境,并清理 ruby 的所有子进程。

用户像 ruby-c 中传递的所有参数和信号都会原封不动的传递给 ruby 进程。

🐧 环境依赖

容器运行时依赖 cgroup 和 namespace,需要 linux 内核版本大于 2.6.24。并且正确挂载了 cgroup。检查文件 /sys/fs/cgroup/cgroup.controllers/sys/fs/cgroup/freezer 中任意一个目录存在即可。

测试环境:ubuntu:22 / ubuntu:20

🛠️ 源码构建

源代码由编程语言 nature 开发,nature 编译器版本需要 >= 0.4.0。安装完成后在源码目录执行 make amd64 && make install 即可安装到 /usr/local/parker 目录下。

1 楼 已删除

有异常信息么,上面的 example 能不能跑通。

设定在太空中的无限奔跑者,run 3 就是沿着你周围的墙壁活着到达出口。

用自己的編程語言寫軟件好酷

It's clear that there is a lot to learn about this. I think you made some good points about features age of war game

需要 登录 后方可回复, 如果你还没有账号请 注册新账号