以下帖子过长,请耐心等待
嗨,我是docker和dds的新手。
我正在使用rti-dds和docker创建一个简单的代码。该代码将为我提供两个exe文件,一个用于发布数据,另一个用于订阅数据。
我想在我的Dockerfile中使用从头开始,因为我不需要bash或任何操作系统。
现在,如果我从头开始使用,我需要使用g ++ -static标志来静态构建我的exe,还是可以动态完成,即没有static标志。
哪个是首选还是有规则?
Docker Verion
客户端:Docker Engine-社区版本:19.03.2API版本:1.40Go版本:go1.12.8Git提交:6a30dfc建成时间:2019年8月29日星期四05:29:11操作系统/ Arch:linux / amd64实验性的:false
当使用-static标志构建exe文件时的Dockerfile
FROM scratch
COPY rti_license.dat /
COPY USER_QOS_PROFILES.xml /
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_publisher /
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_subscriber /
CMD ["/DynamicTest_publisher"]
Docker镜像成功构建并运行,没有任何错误
BUT
动态生成exe文件时的Dockerfile(无静态标志)
也将复制所有依赖关系使用
检查了依赖关系exe上的ldd
FROM scratch
COPY rti_license.dat /
COPY USER_QOS_PROFILES.xml /
COPY /lib/x86_64-linux-gnu/libdl.so.2 /
COPY /lib/x86_64-linux-gnu/libnsl.so.1 /
COPY /lib/x86_64-linux-gnu/libpthread.so.0 /
COPY /lib/x86_64-linux-gnu/librt.so.1 /
COPY /usr/lib/x86_64-linux-gnu/libstdc++.so.6 /
COPY /lib/x86_64-linux-gnu/libc.so.6 /
COPY /lib/x86_64-linux-gnu/libgcc_s.so.1 /
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_publisher /
COPY /objs/x64Linux3gcc4.8.2/DynamicTest_subscriber /
COPY /lib64/ld-linux-x86-64.so.2 /
CMD ["/DynamicTest_publisher"]
构建docker映像
docker build --tag dynamictest .
但是当我尝试运行此命令时,出现以下错误
docker run --rm -it dynamictest
错误standard_init_linux.go:211:exec用户进程导致“没有这样的文件或目录
所以,我是否在这里遗漏了一些东西,或者是“ FROM scratch仅适用于静态版本”
最适合我的方法-动态构建
头一件事就是找出您exe文件的所有依赖项
$ldd dytest_publisher
linux-vdso.so.1 => (0x00007ffec3df9000)
libdl.so.2 => /usr/lib64/libdl.so.2 (0x00007ffb0e740000)
libnsl.so.1 => /usr/lib64/libnsl.so.1 (0x00007ffb0e526000)
libpthread.so.0 => /usr/lib64/libpthread.so.0 (0x00007ffb0e30a000)
librt.so.1 => /usr/lib64/librt.so.1 (0x00007ffb0e102000)
libstdc++.so.6 => /usr/local/lib64/libstdc++.so.6 (0x00007ffb0dd28000)
libm.so.6 => /usr/lib64/libm.so.6 (0x00007ffb0da26000)
libc.so.6 => /usr/lib64/libc.so.6 (0x00007ffb0d665000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffb0e945000)
libgcc_s.so.1 => /usr/local/lib64/libgcc_s.so.1 (0x00007ffb0d44c000)
将以上库以及文件夹结构复制到您的项目文件夹中,并创建一个名为Dockerfile的Docker文件] >>
Dockerfile
FROM scratch COPY rti_license.dat / COPY USER_QOS_PROFILES.xml / COPY /objs/x64Linux3gcc4.8.2/DynamicTest_publisher / COPY /objs/x64Linux3gcc4.8.2/DynamicTest_subscriber / COPY /lib64/* /lib64/ COPY /usr/lib64/* /usr/lib64/ ENV LD_LIBRARY_PATH=/usr/lib64/:/lib64/ CMD ["/dytest_publisher"]
注:项目文件夹必须具有目录:/ usr / lib64 /和/ lib64 /以及所有依赖的库。可以通过以下命令检查依赖的库:
$ldd "your exe file"
构建docker映像
docker build --tag dynamictest .
运行创建的图像
docker run --rm -it dynamictest
查看正在运行的容器
docker container ls
PS:感谢大家在此方面的帮助