mysql 在 rakudo-star docker 图像上使用 DBIish 的安装要求

Installation Requirements for mysql with DBIish on rakudo-star docker image

我正在根据最新的 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

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

在 Debian Testing/Unstable 和最近的衍生产品上:

$ 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

创建 link:

$ 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
[...]

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

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

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

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