前段時間發(fā)現(xiàn)一個非常極客的項(xiàng)目:dockerc,一直沒時間去嘗試,今天試了一下果然可以正常運(yùn)行。
以下是我測試將 webman
鏡像編譯為二進(jìn)制文件的項(xiàng)目目錄。
可以不使用 opcache
,我主要是為了測試把php
代碼先編譯為 opcode
,然后清空源文件。
webman
├── app
├── composer.json
├── composer.lock
├── config
├── Dockerfile
├── LICENSE
├── php
├── php.ini
├── process
├── public
├── README.md
├── runtime
├── start.php
├── support
├── vendor
├── windows.bat
└── windows.php
Dockerfile 內(nèi)容:
FROM alpine:latest
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g" /etc/apk/repositories
RUN apk update && \
apk --no-cache upgrade && \
rm -rf /var/cache/apk/* && \
mkdir -p /app/opcache
WORKDIR /app
COPY ./ /app/
# 直接使用 PHP 靜態(tài)二進(jìn)制文件
RUN mv /app/php /usr/local/bin/php && chmod +x /usr/local/bin/php
# 將 PHP 代碼編譯為 opcode
RUN find /app -type f -name "*.php" -exec php -c /app/php.ini -l {} \;
# 清空 PHP 源文件
RUN find /app -type f -name "*.php" -exec sh -c 'echo -n > {}' \;
EXPOSE 8787
CMD ["php", "-c", "php.ini", "start.php", "start"]
php.ini 內(nèi)容:
date.timezone="UTC"
opcache.enable = 1
opcache.enable_cli = 1
opcache.save_comments = 0
opcache.file_update_protection = 0
opcache.validate_timestamps = 0
opcache.validate_permission = 0
opcache.validate_root = 0
opcache.file_cache = /app/opcache
opcache.file_cache_only = 1
opcache.file_cache_consistency_checks = 0
opcache.max_file_size = 0
opcache.file_update_protection = 0
步驟如下:
webman
鏡像
docker build . -t fuzqing/webman:8.3.6 --load
dockerc
wget https://github.com/NilsIrl/dockerc/releases/download/v0.2.1/dockerc
chmod +x dockerc
dockerc
將鏡像導(dǎo)出為二進(jìn)制文件
./dockerc --image docker-daemon:fuzqing/webman:8.3.6 --output webman.bin
./webman.bin
webman.bin
上傳到其它 x86_64
架構(gòu)的 Linux
機(jī)器上測試,證明以下機(jī)器沒有安裝docker
和 php
,并且能成功運(yùn)行。注意:為了提高兼容性,需要先將 docker
配置為 vfs
存儲驅(qū)動。
docker
文檔地址:https://docs.docker.com/storage/storagedriver/vfs-driver/
本質(zhì)上來說還是會進(jìn)行解壓之后再運(yùn)行的,可以獲取到項(xiàng)目完整的 opcode
,但是如果對方?jīng)]有能力將 opcode
反編譯為 PHP
源碼,那么本方案也可以用來“加密”了,加解密的對抗無非是成本問題。
另外,你完全可以不采用 PHP
二進(jìn)制文件,我只是為了測試能否正常編譯和執(zhí)行,這就是一個 Docker Image
,完全可以另外安裝你喜歡的加密擴(kuò)展,在 Dockerfile
里面對 PHP
源碼進(jìn)行混淆和加密處理,最后編譯為 opcode
和清空源文件,而不影響本地的源代碼。
借助本思路,如果不喜歡使用 dockerc
導(dǎo)出為二進(jìn)制文件,你也可以使用 Docker Image
進(jìn)行交付,也就是說只少了 dockerc
導(dǎo)出步驟,部署時候采用 docker
的方式。
為什么會有這個錯誤:mksquashfs: dl-call-libc-early-init.c:37: _dl_call_libc_early_init: Assertion
sym != NULL' failed`
牛*
好高級的玩法,可以用來做加密么?就是直接分發(fā)二進(jìn)制文件,對方拿不到源碼