【问题标题】:Installation Requirements for mysql with DBIish on rakudo-star docker image在 rakudo-star docker 映像上使用 DBIish 的 mysql 的安装要求
【发布时间】:2018-10-14 22:50:48
【问题描述】:

我正在根据最新的 rakudo-star docker 镜像创建自己的 docker 镜像。我想使用 DBIish 连接到 mysql 数据库。不幸的是,我无法让 DBDish::mysql 工作。

我已经安装了 default-libmysqlclient-dev,你可以在

中看到
# find / -name 'libmysqlclient*.so'
/usr/lib/x86_64-linux-gnu/libmysqlclient_r.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so

我面临的错误是:

# perl6 -Ilib -e 'use DBDish::mysql; DBDish::mysql.connect()'
Cannot locate native library 'mysqlclient': mysqlclient: cannot open shared object file: No such file or directory
  in method setup at /usr/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 289
  in method CALL-ME at /usr/share/perl6/sources/24DD121B5B4774C04A7084827BFAD92199756E03 (NativeCall) line 539
  in method connect at /root/DBIish/lib/DBDish/mysql.pm6 (DBDish::mysql) line 12
  in block <unit> at -e line 1

【问题讨论】:

  • 您是在 docker 容器内手动创建映像吗?您使用的是什么基础映像?
  • 我自己的 Dockerfile 使用 rakudo-star docker 镜像作为基础。我唯一做的就是安装一些 debian 软件包,包括“default-libmysqlclient-dev”。除了安装一些 perl6 模块外,其中还有 DBIish。
  • 如果您共享您正在使用的 Dockerfile 会更好......很难说其他方式。很明显它没有找到共享库,但是如果我们不知道它是如何安装的,就很难知道原因......
  • 没办法。我已经定义了LD_LIBRARY_PATH,从/usr/lib 链接,定义了DBIISH_MYSQL_LIB,没有办法。在DBIish issues 中发现了类似的问题。也许写一个问题会是最好的......

标签: mysql docker raku


【解决方案1】:

简短回答:您需要包 libmysqlclient20(我将文档请求添加到类似的 DBIish 问题中)。 Debian 9(目前稳定)使用比 Ubuntu 18.04(目前稳定)和 Debian Unstable 更旧的版本。它也指 mariadb 而不是 mysql。 在基于 Debian Stable 的图像上选择 libmariadbclient18 并使用 mysql 名称创建一个链接(见下文)

关于 Debian 测试/不稳定和最近的衍生产品:

$ sudo apt-get install libmysqlclient20
$ dpkg -L libmysqlclient20
/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.20.3.9
/usr/share
/usr/share/doc
/usr/share/doc/libmysqlclient20
/usr/share/doc/libmysqlclient20/NEWS.Debian.gz
/usr/share/doc/libmysqlclient20/changelog.Debian.gz
/usr/share/doc/libmysqlclient20/copyright
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.20

关于 Debian 9 及其衍生版本:

$ dpkg -L libmariadbclient18
/.
/usr
/usr/lib
/usr/lib/x86_64-linux-gnu
/usr/lib/x86_64-linux-gnu/libmariadbclient.so.18.0.0
/usr/lib/x86_64-linux-gnu/mariadb18
/usr/lib/x86_64-linux-gnu/mariadb18/plugin
/usr/lib/x86_64-linux-gnu/mariadb18/plugin/client_ed25519.so
/usr/lib/x86_64-linux-gnu/mariadb18/plugin/dialog.so
/usr/lib/x86_64-linux-gnu/mariadb18/plugin/mysql_clear_password.so
/usr/share
/usr/share/doc
/usr/share/doc/libmariadbclient18
/usr/share/doc/libmariadbclient18/changelog.Debian.gz
/usr/share/doc/libmariadbclient18/copyright
/usr/lib/x86_64-linux-gnu/libmariadbclient.so.18

创建链接

$ sudo ln -s /usr/lib/x86_64-linux-gnu/libmariadbclient.so.18 /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18

为了说明这一点,我为这个场合创建了一个 Ubuntu 18.04 容器*:

docker run -ti --rm --entrypoint=bash rakudo/ubuntu-amd64-18.04

以及缩写的命令和输出:

# apt-get install -y libmysqlclient20 build-essential
# zef install DBIish
# perl6 -e 'use DBDish::mysql; DBDish::mysql.connect()'
Cannot look up attributes in a DBDish::mysql type object
[...]

错误是因为我没有为连接传递正确的参数,因为我没有运行数据库。重要的是没有 .so 文件丢失。

*:我把它上传到了 Docker Hub,正常运行会让你直接进入 REPL:

$ docker run -ti --rm rakudo/ubuntu-amd64-18.04
To exit type 'exit' or '^D'
> 

(我在调试的时候没有使用Star镜像,不过没关系,因为这是一个比较通用的问题。)

【讨论】:

  • 对,但是没有包含 libmysqlclient.so.20 文件的 debian 稳定包。我认为这仅适用于 SID。这是否意味着 DBIish 无法处理 rakdudo-star 图像?
  • 好吧,不是 Rakudo Star 图像的真正用户(我使用较小的图像)。我调整了答案,使其还包括 Debian 9(Rakudo Star 图像的基础)的说明。
  • 太棒了!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-23
  • 2020-04-28
  • 2020-10-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-25
  • 2019-09-03
相关资源
最近更新 更多