Parker 輕量級打包工具與容器執行時,一條命令將 php 指令碼打包成可執行檔案

Max發表於2023-09-22

將工作目錄打包成可執行檔案,並以輕量級容器的方式直接執行在目標機器上。

示例是一個 c 語言編寫的 ip 解析服務 gcc -o ipservice,其依賴 ipdb 資原始檔。

使用 parker 將可執行檔案 ipservice 和其依賴的 assert 壓縮並打包成新的可執行檔案 ipservice-c。

在目標機器上執行 ipservice-c 將會生成一個輕量的容器環境來執行原始的 ipservice 服務和其關聯的資原始檔。

倉庫地址: github.com/weiwenhao/parker

⚙️ 安裝

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

示例

上面的可執行檔案+資原始檔打包是標準使用示例,當然也有一些非標準的使用方式,比如以一個 php 編寫的 server 為例子

> tree .
.
├── php  # cp /usr/bin/php8.1 ./php
└── server.php

0 directories, 2 files

server.php 內容如下

<?php
echo "hello world";
?>

cd 到工作目錄中執行 parker php,你將會得到一個 php-c 檔案,這就是打包好的可執行檔案,將其上傳到目標機器中執行即可。下面是在目標機器上執行的示例,可以看到此時只有 php-c 檔案,而沒有 server.php 啦

> > parker php
php-c
├── server.php
└── php
? parker successful

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

0 directories, 1 file

------------------------------------------------------------------------ run php-c
> ./php-c -S 0.0.0.0:8000 server.php
[Thu Sep 21 14:15:23 2023] PHP 8.1.2-1ubuntu2.14 Development Server (http://0.0.0.0:8000) started

此處 php-c 會將引數傳遞給 php 程式。

❗️ parker 不解決 php 的動態編譯問題。

? 執行說明

php-c 是 parker 構建的輕量級容器執行時,並且 php-c 是一個靜態編譯的可執行檔案。其在執行時透過 linux namespace
建立了一個隔離環境,並解壓工作目錄執行目標 php 。

php-c 將監聽 python 主程式的執行,一旦 php 程式停止或異常,php-c 會透過 cgroup 清理容器環境,並清理 php 的所有子程式。

使用者像 php-c 中傳遞的所有引數和訊號都會原封不動的傳遞給 php 程式。

? 環境依賴

容器執行時依賴 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 目錄下。

本作品採用《CC 協議》,轉載必須註明作者和本文連結

相關文章