最近更新真是越来越。。。。算了,今晚解决了一个历史遗留问题——以前构建Ptunnel都是依赖Debian、Ubuntu这些镜像。体积大,耗流量。之所以没有基于Alpine是因为这份代码是十多年前的,在Alpine下构建不能通过,而我又不懂C语言,所以就搁置了。然后今晚抱着玩玩的心态,改了一下源码(瞎改)。。。。
结果,居然编译通过了,通过了,过了,了。。。。
主要的依赖可以一个个慢慢摸索,其中“艰辛”就不说了,主要麻烦是一个名为unistd.h的文件不能引入,然后查了不少资料,原来改名了,现在叫做asm/unistd.h,而以前叫做sys/unistd.h,解决了这个问题,其他依赖再理一理就没什么大问题了(虽然编译过程还有一个警告,但是我们“无视警告”,笑)。
最后来个小贴士(以前好像说过):
Alpine构建可以使用--virtual参数指定构建过程需要安装的包,这样构建的镜像体积会小很多。
举个例子:
RUN apk add build-base
RUN apk del build-base
上面这种方式看似是删除了build-base这个包,但并不会减少镜像体积,原因很简单,安装过程被记录保存下来了(Docker原理以前讲过,省些字数)。
使用下面的方式:
RUN apk add --virtual BUILD build-base && \
apk del BUILD
build-base这个包不会被记录下来,可以减少150MB的体积呐~
同一个软件第一种方式构建体积有160MB,第二种方式只有9MB,压缩传输体积更加小。
REPOSITORY TAG IMAGE ID CREATED SIZE
zuolan/ptunnel local 0cc925b779da 3 minutes ago 9.23 MB
<none> <none> 36a25dbadd2b 6 minutes ago 160 MB
最后附上修改后 Ptunnel 源代码:
https://github.com/izuolan/dockerfiles
部分 Dockerfile:
FROM alpine:edge
COPY . /build
WORKDIR /build
RUN echo '@edge http://nl.alpinelinux.org/alpine/edge/main' >> /etc/apk/repositories && \
echo '@community http://nl.alpinelinux.org/alpine/edge/community' >> /etc/apk/repositories && \
echo '@testing http://nl.alpinelinux.org/alpine/edge/testing' >> /etc/apk/repositories && \
apk add --no-cache \
libpcap-dev \
linux-headers && \
apk add --no-cache --virtual BUILD build-base && \
make && make install && \
apk del BUILD
如何使用这个玩意?管理Ptunnel的脚本:https://github.com/izuolan/Pshell