sqlite - 在 docker 容器中运行 go binary 时找不到 Spatialite 扩展

标签 sqlite docker go dynamic-library spatialite

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

Go-spatialite,在我的理解中会在运行时动态加载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

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

谢谢

最佳答案

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 )

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

关于sqlite - 在 docker 容器中运行 go binary 时找不到 Spatialite 扩展,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51837129/

相关文章:

go - 在 go 中键入断言错误

loops - 在循环中使用 defer 释放资源的正确方法?

go run 使用陈旧版本的子包

sql - 将多个结果合并为列,而不是行

iOS SQLite Blob 数据正在保存 NULL

nhibernate - 无法从NHibernate.Driver.SQLiteDriver创建驱动程序

django - docker-compose postgres 自定义数据库详细信息

docker - 将 Docker 作为 Conemu 任务运行

python - 看不到 Django 测试用例插入的记录

wordpress - 在 Azure 上使用 docker 托管 WordPress