liujiusheng / blog

个人博客,blog
19 stars 0 forks source link

基于alpine制作一个只有100多M的GDAL镜像 #212

Open liujiusheng opened 2 years ago

liujiusheng commented 2 years ago

由于要将GDB数据导入到PG数据库,且要支持中文别名,所以不能直接使用官方提供的Docker镜像。

原来我们基于CentOS编译的GDAL镜像有2G之巨,不便于内外网拷备,迫切需要制作一个体积小的GDAL镜像。

制作小镜像首先基础镜像肯定要小,于是选用了alpine作为基础镜像: FROM alpine:3.14

常见错误1:

No such file or directory

官方的Dockerfile中,软件源代码是通过wget方法在github上下载的,由于github在国内的不稳定性,下载大概率失败,就导致解压时无法读取到这个文件。可以下载好文件后放在本地来解决这个问题。

常见错误2: tar:invalid magic tar:short read tar: /opt/gdal-master.tar.gz: not found in archive

官方解压命令用的: tar xz,这个与打包的时候参数不匹配,导致解压失败,应改为:tar xzf命令。

常见问题3: 下载速度慢。 系统默认是在https://dl-cdm.alpinelinux.org/alpine/v3.14/这个地址去下载软件安装包的,这个地址不稳定,会导致下载速度过慢或失败的问题。

常见问题4: 未使用缓存导致安装慢。

命令中有很多--no-cache的命令,导致每次安装都未使用系统缓存,编译和包下载速度变慢。

可以检查一下命令,如果不是必须的话可以移除对应命令行的--no-cache命令。

常见问题5:

Permission denied

安装软件时系统执行权限不够或网络不稳定都可能造成这个问题。

一是通过在:FROM alpine:3.14命令的下一行添加:USER root命令提升权限。 二是检查网络增加网络稳定性,如无法提升网络稳定性就只有多试几次咯。

常见问题6: 软件重复安装导致安装慢。

命令中出现过多次apk add cmakeapk del cmake包的操作,可以考虑只安装一次,最后再删除。

常见问题7:

#17 406.4 /usr/lib/gcc/x86_64-alpine-linux-musl/10.3.1/../../../../x86_64-alpine-linux-musl/bin/ld: warning: libdl.so.2, needed by /lib/libFileGDBAPI.so, not found (try using -rpath or -rpath-link)
#17 406.4 /usr/lib/gcc/x86_64-alpine-linux-musl/10.3.1/../../../../x86_64-alpine-linux-musl/bin/ld: warning: libpthread.so.0, needed by /lib/libFileGDBAPI.so, not found (try using -rpath or -rpath-link)
#17 406.4 /usr/lib/gcc/x86_64-alpine-linux-musl/10.3.1/../../../../x86_64-alpine-linux-musl/bin/ld: warning: librt.so.1, needed by /lib/libFileGDBAPI.so, not found (try using -rpath or -rpath-link)
#17 406.4 /usr/lib/gcc/x86_64-alpine-linux-musl/10.3.1/../../../../x86_64-alpine-linux-musl/bin/ld: warning: libm.so.6, needed by /lib/libFileGDBAPI.so, not found (try using -rpath or -rpath-link)
#17 406.4 /usr/lib/gcc/x86_64-alpine-linux-musl/10.3.1/../../../../x86_64-alpine-linux-musl/bin/ld: warning: libc.so.6, needed by /lib/libFileGDBAPI.so, not found (try using -rpath or -rpath-link)

FilGDBAPI对linux操作系统有一定要求,在alpine系统中没有ld命令,所以报了以上错误。

试过添加libc6-compat包,报错减少了,但是还出现libdl.so.2的报错。

经验证发现alpine的ld命令在/usr/x86_64-alpine-linux-musl/bin目录下。

骑过安装libc6-compat这个包可以解决其它几个报错,但是libdl.so.2缺失的报错依旧还在。

使用过高版本(20以上)的ubuntu基础镜像时安装gcc和g++库时容易报错,换个低点的版本就好了。

好不容易编译成功了可能会报错:

ogr2ogr:error while loading shared libraries:libgdal.so.29:cannot open shared object file:No such file or directory

首先是要找看/usr/local/lib目录下是否有这个文件 ,然后可以查看文件是否引用了libgdal.so.29这个文件: /etc/ld.so.conf

修改后执行命令更新配置,会列出来一大堆引用信息: /sbin/ldconfig -v

其中可能会报错: /sbin/ldconfig.real: /usr/local/lib/libgdal.so.29 is not a symbolic link

查看/usr/local/lib目录下有:libgdal.so.29.0.3这个文件 ,所以链接过去就好了: ln -s libgdal.so.29.0.3 libgdal.so.29

再次调用ogr2ogr命令会报错,这个错误是由于proj是直接安装的libproj-dev导致的:

ogr2ogr: error while loading shared libraries:libproj.so.19:cannot open shared object file:No such file or directory