使用动态构建从头开始使用Dockerfile

问题描述 投票:0回答:1

以下帖子过长,请耐心等待

嗨,我是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仅适用于静态版本”

docker g++ dockerfile data-distribution-service
1个回答
0
投票

最适合我的方法-动态构建

头一件事就是找出您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:感谢大家在此方面的帮助

© www.soinside.com 2019 - 2024. All rights reserved.