在容器中执行容器中的二进制和在容器中执行宿主机的二进制有什么区别

2023-12-22 15:48:35 +08:00
 rower
我嘞个豆,事情是这样的,我有个朋友。
他的二进制文件比如叫 dollar ,使用 docker-compose 运行
docker-compose 如下

dollar:
image: alpine:xxx
volumes:
- /opt:/opt
working_dir: /opt/dollar
command: ["./dollar"]

他没有把 dollar 这个二进制放到容器中,而是在宿主机上,使用挂载卷的方式在容器中能直接访问宿主机上的文件,然后启动的。

感觉这个和我学的不一样啊,我学的都是在容器中构建二进制,然后在容器中直接启动了,这两种方式有啥不一样吗
1239 次点击
所在节点    Docker
9 条回复
F7TsdQL45E0jmoiG
2023-12-22 15:54:22 +08:00
明显他的 image 比你的小
nilai
2023-12-22 15:55:19 +08:00
这没什么问题啊, 通过目录挂载进去的执行的, 其实 docker 中运行的进程在宿主机的进程列表中都能看到, 你可以把 docker 想像为加上了一些资源隔离机制的进程。
harry890829
2023-12-22 15:55:21 +08:00
本身没有不一样,Linux 都是通过明明空间分隔的,最后其实都是执行了一个二进制,你学的也没有问题,但是应该是实践不多,如果是容器编译环境的话,一般是会使用一个`FROM golang:1.18 as builder`进行容器的编译,然后将编译结果和依赖文件复制到一个新的镜像中,要不然我发布一个 docker image 一定要带着我源码给出去嘛
rower
2023-12-22 15:57:20 +08:00
@morenacl 没毛病
rower
2023-12-22 16:11:54 +08:00
@harry890829 ok ,这个我知道了,源码在新的镜像中,便于分发
leonshaw
2023-12-22 16:16:56 +08:00
应该是不想每次更新版本的时候重发 image
senhtry
2023-12-22 16:34:29 +08:00
没有问题的。golang 这些程序是 static 的,不依赖 glibc ,容器里面和外面运行都没有影响。
如果是 c ,rust 这些需要 glibc 的,在外面编译的,不一定在容器里面能运行,glibc 版本不一定对。
容器里面运行的程序,如果没有 privileged ,相同的 syscall 权限是有限制的,比如创建异步线程啥的之类。
boris1993Jr
2023-12-22 17:57:12 +08:00
@rower #5 不是源码在镜像里,而是编译出来的二进制在镜像里
比如我的这个 dockerfile ,可以看到里面有 4 个 FROM ,但是最后发布出去的只有最后那个"final"容器里面的东西,"build"和"publish"都只是分层构建的中间产物
https://github.com/boris1993/tiantang-auto-harvest/blob/master/tiantang-auto-harvest/Dockerfile
julyclyde
358 天前
这可执行文件并不是镜像的一部分啊
相当于只提供了运行时隔离,没有提供文件系统的发行

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1002656

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX