【问题标题】:Dockerfile from scratch using dynamic build使用动态构建从头开始构建 Dockerfile
【发布时间】:2019-10-03 06:50:41
【问题描述】:

以下贴太长,请耐心看完

嗨,我对 docker 和 dds 很陌生。

我正在使用 rti-dds 和 docker 创建一个简单的代码。 该代码将为我提供两个 exe,一个用于发布数据,另一个用于订阅数据。

我想在我的 Dockerfile 中从头开始使用,因为我不需要 bash 也不需要任何操作系统。

现在,如果我从头开始使用,我需要让我的 exe 使用 g++ -static 标志静态构建还是可以动态完成,即没有静态标志。

首选哪一个或有规则吗?

Docker 版本

客户:Docker 引擎 - 社区
版本:19.03.2
API 版本:1.40
Go 版本:go1.12.8
Git 提交:6a30dfc
建成:2019 年 8 月 29 日星期四 05:29:11
操作系统/架构:linux/amd64
实验:错误

使用 -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 镜像成功构建并运行,没有任何错误

但是

动态构建 exe 文件时的 Dockerfile(无静态标志)

确定所有依赖项也将被复制 使用

检查依赖项

ldd 在 exe 上

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 用户进程导致“没有这样的文件或目录

那么,我是在这里遗漏了什么还是“从头开始仅适用于静态构建”

【问题讨论】:

  • 理论上你想要做的事情是可能的。请记住,您只能在当前目录中使用COPY 文件(/lib64/ld-linux-x86-64.so.2 相对于docker build 目录进行解释)。您可以尝试将/lib/ld-linux-x86-64.so.2 --list /DynamicTest_publisher 作为容器命令,作为ldd 的长手动形式,看看它是否找到了所有内容。
  • 嗨@DavidMaze,感谢您的调查,我尝试将 Dockerfile CMD 更改为 CMD /lib/ld-linux-x86-64.so.2 --list /DynamicTest_publisher ,仍然没有运气。 docker: Error response from daemon: OCI runtime create failed: container_linux.go:345: starting container process caused "exec: \"/lib64/ld-linux-x86-64.so.2 --list /DynamicTest_publisher\": stat /lib64/ld-linux-x86-64.so.2 --list /DynamicTest_publisher: no such file or directory": unknown.
  • 为什么不在动态构建中复制所有 ndds 库?
  • @JohnnyWillemsen 我确实复制了所有必需的库,但问题是因为我使用的是从头开始,所以我必须在 exe 上执行 ldd 以查看所有动态库都需要什么,然后我将它们与文件夹一起复制结构,之后我也必须使用 docker 文件中的 COPY 命令将它们复制到容器中,最后它工作了。

标签: docker g++ dockerfile data-distribution-service


【解决方案1】:

这对我来说效果最好 - 动态构建

首先要找出你的 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:感谢大家对此的帮助

【讨论】:

  • 让我开心!非常感谢!
猜你喜欢
  • 2014-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-23
  • 1970-01-01
相关资源
最近更新 更多