有什么解决方案可以在从主机挂载的容器中执行二进制文件吗?
Is there any solution to execute binary in container that mount from host?
就我而言,我已经在基于 Unix 的主机上安装了 ssmtp 包。
由于某种原因,在我的情况下,最好的方法是在我的主机上使用 ssmtp 二进制文件(在 /usr/sbin 下)在我的 APP 容器中发送邮件(html 文件)。
我尝试将主机目录 /usr/bin 挂载到容器中:
docker run -v /usr/sbin:/host_sbin --name=myapp -ti -p 889:80 -p 890:5432 myimage
并尝试执行 ssmtp,这里有一些笨拙的尝试及其结果:
在我的APP容器中/host_sbin
下
ssmtp ---> bash: ssmtp: command not found
./ssmtp ---> bash: ./ssmtp: No such file or directory
看来事情并没有我想的那么简单。
任何人都可以做这样的事情与我分享解决方案吗?
如果有人能向我解释为什么那行不通,我将不胜感激。
简单地将二进制文件安装到您的容器中是行不通的,因为 ssmtp
二进制文件可能不是静态链接的。相反,它动态链接到一组共享库,这些共享库存在于您的主机系统中,但不存在于您的容器中。您可以使用 ldd
命令验证这一点,它将打印 ssmtp
二进制文件链接的所有库:
> ldd /usr/sbin/ssmtp
如果您想使用主机 ssmtp
二进制文件,您还必须将所有必需的共享库安装到容器中(并调整库路径等;我建议不要这样做)。
这是我的建议:重要的一点可能不是 ssmtp
二进制文件,而是 SSMTP 的配置文件(取决于您的发行版,但通常在 /etc/ssmtp
).我建议...
- 正在使用映像的本机包管理器在您的容器中安装
ssmtp
。不要将二进制文件从主机挂载到容器中。
- 将主机 SSMTP 配置文件挂载到您的容器中(在创建容器时使用
-v /etc/ssmtp:/etc/ssmtp
标志)
就我而言,我已经在基于 Unix 的主机上安装了 ssmtp 包。 由于某种原因,在我的情况下,最好的方法是在我的主机上使用 ssmtp 二进制文件(在 /usr/sbin 下)在我的 APP 容器中发送邮件(html 文件)。
我尝试将主机目录 /usr/bin 挂载到容器中:
docker run -v /usr/sbin:/host_sbin --name=myapp -ti -p 889:80 -p 890:5432 myimage
并尝试执行 ssmtp,这里有一些笨拙的尝试及其结果:
在我的APP容器中/host_sbin
下 ssmtp ---> bash: ssmtp: command not found
./ssmtp ---> bash: ./ssmtp: No such file or directory
看来事情并没有我想的那么简单。 任何人都可以做这样的事情与我分享解决方案吗? 如果有人能向我解释为什么那行不通,我将不胜感激。
简单地将二进制文件安装到您的容器中是行不通的,因为 ssmtp
二进制文件可能不是静态链接的。相反,它动态链接到一组共享库,这些共享库存在于您的主机系统中,但不存在于您的容器中。您可以使用 ldd
命令验证这一点,它将打印 ssmtp
二进制文件链接的所有库:
> ldd /usr/sbin/ssmtp
如果您想使用主机 ssmtp
二进制文件,您还必须将所有必需的共享库安装到容器中(并调整库路径等;我建议不要这样做)。
这是我的建议:重要的一点可能不是 ssmtp
二进制文件,而是 SSMTP 的配置文件(取决于您的发行版,但通常在 /etc/ssmtp
).我建议...
- 正在使用映像的本机包管理器在您的容器中安装
ssmtp
。不要将二进制文件从主机挂载到容器中。 - 将主机 SSMTP 配置文件挂载到您的容器中(在创建容器时使用
-v /etc/ssmtp:/etc/ssmtp
标志)