LabVIEW Linuxで作成した共有ライブラリ(.so)を Go言語で呼び出しdocker+centos+LvRuntimeで動かす

概要

以前の記事、 LabVIEWで作った .so(shared library)を Goから呼び出す の続き、というか、番外編。
続きといいつつ、LabVIEW 2019にアップグレードしてたりしますが、そこははしょります。
LabVIEWで作成した.soとそれを呼び出す実行ファイルを、Dockerでcentos+labview runtimeコンテナを作って、その上で動かす、という実験をやってみました。
なんの役に立つのかというと、例えば、LabVIEWで何かのデータ解析するすんごいライブラリを作ったとして、Dockerコンテナーで動くようにしておけば、それをAWSとかGoogleCloudPlatform等のクラウドで動かせるようになるかもしれない。

結果

結果としては、動きました。

手順

1. LabVIEW Runtime入りのOSイメージを作成

centosへのLabVIEW Runtimeのインストール、この状態でイメージを作成しておく。

ベースはcentos にした理由は、LabVIEWが正式サポートしているのがRedhad/Centosで、
Runtimeのインストーラrpm形式となっているため。 Ubuntuにインストールするよりトラブルが少ないはず、と予想。
実際、INSTALLスクリプトを実行するだけで、すんなりインストールできた。

LabVIEW Runtime downloadのページからLabVIEW Runtime installerをダウンロードしておく。
(Installerのダウンロードも wget などで自動ダウンロードできればよいが、URL指定ではダウンロードできなかった。)

LabVIEW Runtime Download - NI

dockerfile を作成して、centosをベースにして、ADDコマンドで、/tmpにRuntime installerをtgzのままコピーさせる。
ADDコマンドだと、tgzファイルを指定しても、コンテナ側にコピーする際に展開してくれる。これも便利。
RUN コマンドで、Runtime installer に含まれる INSTALL(bashスクリプト)を実行させるようにする。
/tmpに解凍したときのファイルの状態をls コマンドで確認して、正しいパスに移動してから実行させる。
(docker run /bin/bashでは、rootユーザで実行するので、sudo を使わなくても実行可能。)

ポイント

いきなりdocker buildしても一度にはうまくいかない。
docker run -i -t /bin/bash を使って、手動でコピーしたり、lsでファイルの状態を確認しながら何度か繰り返す。
/bin/bashで動かしているときは、exitでbashを抜けるとコンテナも終了する。
--rm を使うと、コンテナ実行終了時にコンテナも削除されるので、余計なコンテナが残らないので、
心おきなく何度も試すことができる。

example Dockerfile

From centos

RUN cd /tmp; mkdir lvrtinstall;
ADD LabVIEW2019SP1f1RTE_Linux.tgz /tmp/lvrtinstall/
RUN cd /tmp/lvrtinstall; ./INSTALL; cd ..; rm -rf lvrtinstall;

2. 1で作成したOSイメージを元にコンテナ実行、その中で実行ファイルを動かす

上記で作成したイメージを元にコンテナを実行して、.soと実行ファイルを動かす。
開始時に、Open X-Window で停止してしまうというトラブルがあった。
UIでひっかかっていそうなので、ビルド設定でフロントパネルを削除すればいいのかと思ったが、そういう設定はできなかった。
じっくり設定を調べて見ると、ビルド設定の Advanced に、"Use embedded version of run-time engine" という項目があったので、これをチェックしてビルドすると実行できるようになった。

ビルド設定 >> Advanced 画面

f:id:alucky4416:20200406231704p:plain
shared library build option >> advanced >> use embedded version of run-time engine

日本語ヘルプでは、
組み込まれたバージョンのRun-Timeエンジンを使用—(Linux
組み込まれたバージョンのランタイムエンジンを使用して、共有ライブラリを作成します。
フロントパネルまたはユーザインタフェースを必要としない環境に共有ライブラリをデプロイする場合、このオプションを選択します。

Dockerの環境に限らず、サーバ用途でGUI(X-Window)無しでセットアップされた環境で LabVIEWで作成した.soを利用したい場合にも使えそう。
なお、このオプションは、Linux版にしかない。
Windows版DLLは、このオプション無しでも、サービスから呼び出すことができる? かどうかは今度機会があれば試しみたい。

参考

alucky4416.hatenablog.com

www.ni.com