访问 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 中的共享库,下面是其中一种方法:
- 在 Dockerfile 中使用 "COPY" 命令复制容器中的共享 libraries/dependencies。示例:复制 {local_path} {docker_path}
- 设置在标准目录集之前首先搜索共享库的环境变量。例如,对于基于 Linux 的 OS,使用 LD_LIBRARY_PATH。环境变量可以通过 Docker's Environment replacement (ENV) 设置 例如:ENV LD_LIBRARY_PATH={docker_path}:$LD_LIBRARY_PATH
目标:
部署可以访问主机共享库 (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 中的共享库,下面是其中一种方法:
- 在 Dockerfile 中使用 "COPY" 命令复制容器中的共享 libraries/dependencies。示例:复制 {local_path} {docker_path}
- 设置在标准目录集之前首先搜索共享库的环境变量。例如,对于基于 Linux 的 OS,使用 LD_LIBRARY_PATH。环境变量可以通过 Docker's Environment replacement (ENV) 设置 例如:ENV LD_LIBRARY_PATH={docker_path}:$LD_LIBRARY_PATH