使用动态构建从头开始创建 Dockerfile
Dockerfile from scratch using dynamic build
以下pos内容过长,请耐心看完
嗨,我是 docker 和 dds 的新手。
我正在使用 rti-dds 和 docker 创建一个简单的代码。
该代码将为我提供两个 exe,一个用于发布数据,另一个用于订阅数据。
我想在我的 Docker 文件中使用 FROM scratch,因为我不需要 bash 也不需要任何 os.
现在,如果我使用 FROM scratch,我是否需要使用 g++ -static 标志静态构建我的 exe,或者是否可以动态完成,即没有静态标志。
首选哪一个或者有规则吗?
Docker 版本
客户端:Docker 引擎 - 社区
版本:19.03.2
API版本:1.40
转版本:go1.12.8
Git 提交:6a30dfc
建成时间:2019 年 8 月 29 日星期四 05:29:11
OS/Arch: linux/amd64
实验性:错误
Dockerfile when exe files are build with-static flag
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 映像成功构建并且 运行s 没有任何错误
但是
Docker动态构建exe文件时的文件(没有静态标志)
计算出所有依赖项也将被复制
使用
检查依赖项
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 用户进程导致“没有这样的文件或目录
所以,我是漏掉了什么还是 "FROM scratch only works with static builds"
这最适合我 - 动态构建
第一件事是找出你的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 : 感谢大家对此的帮助
以下pos内容过长,请耐心看完
嗨,我是 docker 和 dds 的新手。
我正在使用 rti-dds 和 docker 创建一个简单的代码。 该代码将为我提供两个 exe,一个用于发布数据,另一个用于订阅数据。
我想在我的 Docker 文件中使用 FROM scratch,因为我不需要 bash 也不需要任何 os.
现在,如果我使用 FROM scratch,我是否需要使用 g++ -static 标志静态构建我的 exe,或者是否可以动态完成,即没有静态标志。
首选哪一个或者有规则吗?
Docker 版本
客户端:Docker 引擎 - 社区
版本:19.03.2
API版本:1.40
转版本:go1.12.8
Git 提交:6a30dfc
建成时间:2019 年 8 月 29 日星期四 05:29:11
OS/Arch: linux/amd64
实验性:错误
Dockerfile when exe files are build with-static flag
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 映像成功构建并且 运行s 没有任何错误
但是
Docker动态构建exe文件时的文件(没有静态标志)
计算出所有依赖项也将被复制 使用
检查依赖项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 用户进程导致“没有这样的文件或目录
所以,我是漏掉了什么还是 "FROM scratch only works with static builds"
这最适合我 - 动态构建
第一件事是找出你的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 : 感谢大家对此的帮助