接着上一篇文章,这次挑战在alpine docker之中编译pdf渲染软件poppler。选择poppler是因为它具有比较多的依赖库,编译有一定的挑战性。当然,alpine linux之中可以用apk命令直接安装poppler,本例子主要关注于docker中开源软件的编译
apk add build-base cmake freetype-dev fontconfig-dev libjpeg-turbo-dev openjpeg-dev openjpeg-tools
cd /tmp
wget https://poppler.freedesktop.org/poppler-0.72.0.tar.xz
tar xJf poppler-0.72.0.tar.xz
cd poppler-0.72.0/
mkdir build
cd build
cmake ../
make
make install
编译过程中会报错
/tmp/poppler-0.72.0/poppler/JPEG2000Stream.cc:20:22: fatal error: openjpeg.h: No such file or directory
这是因为popple的openjpeg-dev包,openjpeg.h位于/usr/include/openjpeg-2.2/目录下。其他的linux发行版本,openjpeg.h位于/usr/include。做个符号链接就好了
cd /usr/include
ln -s openjpeg-2.3/openjpeg.h openjpeg.h
ln -s openjpeg-2.3/opj_stdint.h opj_stdint.h
ln -s openjpeg-2.3/opj_config.h opj_config.h
过程还算比较顺利的。alpine的包管理还是不错的,很多流行的软件包都有。
既然程序已经编译出来了,我们就简单的测试一下。想运行一下pdfinfo,结果报错
Error loading shared library libpoppler.so.83: No such file or directory (needed by pdfinfo)
看了一下,make install把poppler的动态库都安装到了/usr/local/lib64下面了,alpine linux不会从这个目录里面找动态库。把/usr/local/lib64下面的文件都mv到/usr/loca/lib下就可以了
从宿主机拷贝一个pdf文件到容器之中
docker cp ./1.pdf container_id:/tmp
然后就可以在容器里面用pdfinfo查看pdf文件的信息了。当然,上面这样操作还是太麻烦了,需要把文件先从宿主机拷贝到容器,再从容器里面执行。如果是pdf转图片,还得把转换出来的图片从容器拷贝回宿主机。有没有更方便的使用方法,避免文件的来回拷贝呢?答案是有的,可以在docker run的时候用-v命令将宿主机上面的目录映射到容器之中。但目前我们的镜像是alpine的基础镜像,重新run一个容器就要重新编译poppler了。还是先把包含poppler的镜像做好吧