访问Docker容器内的共享库

时间:2019-09-26 09:34:41

标签: docker mono shared-libraries raspberry-pi3 linphone

目标
部署一个可以访问主机共享库(liblinphone.so)或可以访问主机上的liphone安装的Docker容器。

正在使用的软件
-Raspberry Pi计算模块
-Mono(C#)
-带C#包装器的Linphone
-Docker

摘要:
我在Mono(C#)中为RPi3编写代码。此代码使用GPIO和linphone安装(Linphone  该系统上安装了ARM版本)。该代码确实可以在本机Mono上完美运行。我的下一个目标是在Docker容器中运行它。为此,我确实设置了一个私有Gitlab服务器,Docker注册表和一个Gitlab管道来制作Docker映像。 Docker镜像的构建没有任何错误。 当我运行代码时,显然找不到liblinphone.so文件。但是我不知道该怎么办。

Docker运行命令:

docker run --privileged -v /etc/ld.so.cache:/etc/ld.so.cache -v /etc/ld.so.conf.d/:/etc/ld.so.conf.d/ -v /usr/local/lib/:/usr/local/lib/ -v /var/run/docker.sock:/var/run/docker.sock [registry]:5000/[image]:latest

我在.so文件和一些引用所在的位置添加了一些卷(不需要某些卷)。 --privileged部分用于访问GPIO。

错误:

Unhandled Exception:
System.DllNotFoundException: linphone assembly:<unknown assembly> type:<unknown type> member:(null)
  at (wrapper managed-to-native) Linphone.Core.linphone_core_set_log_level_mask(uint)
  at Linphone.Core.SetLogLevelMask (System.UInt32 mask) [0x00001] in <5285048db55d447fae3be4c32e253dbd>:0 
  at BlackBox.Phone.CreatePhone (System.String username, System.String password, System.String server, System.Int32 port, System.String agent, System.String version) [0x00001] in <5285048db55d447fae3be4c32e253dbd>:0 
  at BlackBox.BlackBox..ctor (BlackBox.BlackBox+AppFunction appFunction) [0x00198] in <5285048db55d447fae3be4c32e253dbd>:0 
  at BlackBox.MainClass.Main (System.String[] args) [0x00001] in <5285048db55d447fae3be4c32e253dbd>:0 
[ERROR] FATAL UNHANDLED EXCEPTION: System.DllNotFoundException: linphone assembly:<unknown assembly> type:<unknown type> member:(null)
  at (wrapper managed-to-native) Linphone.Core.linphone_core_set_log_level_mask(uint)
  at Linphone.Core.SetLogLevelMask (System.UInt32 mask) [0x00001] in <5285048db55d447fae3be4c32e253dbd>:0 
  at BlackBox.Phone.CreatePhone (System.String username, System.String password, System.String server, System.Int32 port, System.String agent, System.String version) [0x00001] in <5285048db55d447fae3be4c32e253dbd>:0 
  at BlackBox.BlackBox..ctor (BlackBox.BlackBox+AppFunction appFunction) [0x00198] in <5285048db55d447fae3be4c32e253dbd>:0 
  at BlackBox.MainClass.Main (System.String[] args) [0x00001] in <5285048db55d447fae3be4c32e253dbd>:0 

我的猜测是我无法安装线性电话.so / installation。但是相反,我必须挂载docker socket并在主机上本地运行它。但这也没有使我成功(由于无知)。

3 个答案:

答案 0 :(得分:1)

要访问docker内部的共享库,以下是方法之一:

  1. 在Dockerfile中使用“ COPY”命令复制容器内的共享库/依赖项。示例:COPY {local_path} {docker_path}
  2. 设置环境变量,其中在标准目录集之前先搜索共享库。例如,对于基于Linux的操作系统,使用LD_LIBRARY_PATH。可以通过Docker's Environment replacement (ENV)设置环境变量,例如:ENV LD_LIBRARY_PATH = {docker_path}:$ LD_LIBRARY_PATH

答案 1 :(得分:0)

在构建容器的Dockerfile中,运行安装命令以安装提供共享库的软件包。

答案 2 :(得分:0)

这是我的DockerFile:

FROM mono:latest
ADD . /src
WORKDIR /src
RUN xbuild BlackBox.csproj
CMD ["mono", "/src/bin/Debug/BlackBox.exe"]

所以我必须做这样的事情:

FROM mono:latest
ADD . /src
WORKDIR /src

RUN apt-get install neededthing another so_on

RUN xbuild BlackBox.csproj
CMD ["mono", "/src/bin/Debug/BlackBox.exe"]

我正确吗,@ Raedwald?