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指定ではダウンロードできなかった。)
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 画面
日本語ヘルプでは、
組み込まれたバージョンのRun-Timeエンジンを使用—(Linux)
組み込まれたバージョンのランタイムエンジンを使用して、共有ライブラリを作成します。
フロントパネルまたはユーザインタフェースを必要としない環境に共有ライブラリをデプロイする場合、このオプションを選択します。
Dockerの環境に限らず、サーバ用途でGUI(X-Window)無しでセットアップされた環境で LabVIEWで作成した.soを利用したい場合にも使えそう。
なお、このオプションは、Linux版にしかない。
Windows版DLLは、このオプション無しでも、サービスから呼び出すことができる? かどうかは今度機会があれば試しみたい。