【问题标题】:Spatialite extension not found when running go binary in docker container在 docker 容器中运行 go binary 时找不到 Spatialite 扩展
【发布时间】:2018-08-14 08:35:18
【问题描述】:

我正在设置一个 Spatialite 数据库(SQLite + Spatialite 扩展)和一个相关的 Go 程序,该程序在 docker 容器中运行,用于查询数据库并返回数据。

Go-spatialite,据我了解,它会在运行时动态加载空间库以查询数据库。在本地运行 Go 程序并使用 Postman 查询服务时一切正常。

但是,当使用容器时,Go程序找不到spatialite扩展:

"error":"shaxbee/go-spatialite: spatialite extension not found."

我使用go-spatialite (shaxbee) packagedatabase/sql 包。我已经在本地安装了 Spatialite。

我这样打开数据库连接:

db, err := sql.Open("spatialite", "path/to/my/db")
if err != nil {
    logVar.WithError(err).Fatal("Impossible to open database")
}
if err := db.Ping(); err != nil {
    logVar.WithError(err).Fatal("Cannot connect to database")
}

我使用这个Dockerfile 来调整我的(基于 alpine-glibc),以便在图像构建期间安装 Spatialite 库。根据Spatialite package,它会寻找不同的空间库并加载它。

在容器中检查/usr/local/lib/时,库就在那里:

libspatialite.a
libspatialite.la
libspatialite.so
libspatialite.so.7
libspatialite.so.7.1.0
libsqlite3.so
libsqlite3.so.0
libsqlite3.so.0.8.6

在我看来,该程序不知道从哪里获取这些库。你有什么想法 ?

谢谢

【问题讨论】:

    标签: sqlite docker go dynamic-library spatialite


    【解决方案1】:

    那个Dockerfile设置了一个libspatialite版本4.3.0a的容器。

    ...
    
    RUN wget "http://www.gaia-gis.it/gaia-sins/freexl-1.0.4.tar.gz" && tar zxvf freexl-1.0.4.tar.gz && cd freexl-1.0.4 && ./configure && make && make install
    
    RUN wget "http://www.gaia-gis.it/gaia-sins/libspatialite-4.3.0a.tar.gz" && tar zxvf libspatialite-4.3.0a.tar.gz && cd libspatialite-4.3.0a && ./configure && make && make install
    
    RUN wget "http://www.gaia-gis.it/gaia-sins/readosm-1.1.0.tar.gz" && tar zxvf readosm-1.1.0.tar.gz && cd readosm-1.1.0 && ./configure && make && make install
    
    RUN wget "http://www.gaia-gis.it/gaia-sins/spatialite-tools-4.3.0.tar.gz" && tar zxvf spatialite-tools-4.3.0.tar.gz && cd spatialite-tools-4.3.0 && ./configure && make && make install
    ...
    

    从最近对go-spatialite 的提交之一,我们可以看到所需的版本是5

    var LibNames = []entrypoint{
        {"mod_spatialite", "sqlite3_modspatialite_init"},
        {"libspatialite.so", "sqlite3_modspatialite_init"},
        {"libspatialite.so.5", "spatialite_init_ex"},
        {"libspatialite.so", "spatialite_init_ex"},
    }
    

    (spatialite.go)

    使用版本 5 的 libspatialite 容器来解决您的问题。

    【讨论】:

    • 在 4.3.0 版本中,我的 usr/local/bin 中有 libspatialite.so.7。即使将 libspatialite 的版本替换为 5,它仍然是 libspatialite.so.7。我会试着弄清楚为什么它是 .7 版本。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 2019-05-14
    • 2017-05-14
    • 2022-12-18
    • 1970-01-01
    相关资源
    最近更新 更多