访问 Docker 容器内的共享库

Access shared library inside a Docker container

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

正在使用的软硬件:
- Raspberry Pi 计算模块
- 单声道 (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 

我的猜测是我无法安装 linphone。so/installation。但是我必须在主机上本地安装 docker 套接字和 运行 。这也没有让我成功(由于无知)。

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

这是我的 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?

要访问 docker 中的共享库,下面是其中一种方法:

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