关于 docker-compose 挂载文件的问题

2019-12-10 10:26:03 +08:00
 icecreamxuegao
昨天用 docker-compose 起了 jenkins 的容器,但是再容器里面执行 docker build 命令的时候提示 docker 命令找不到,我就把 docker 和 docker.sock 文件都挂载到了容器里面。在容器用 ls 命令查看的时候一切正常,但是使用 docker 命令的时候提示:
bash-4.4# docker ps
bash: /usr/bin/docker: No such file or directory
百度了好多地方还是没有找到解决方案,所以来问问各位大神。
docker-compose 的配置文件如下:
version: "3"

services:
jenkins:
image: jenkins/jenkins:alpine
restart: always
user: root
container_name: jenkins
volumes:
- /root/jenkins/j-data:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
- /usr/bin/docker:/usr/bin/docker
ports:
- "8080:8080"
- "50000:50000"
networks:
- jenkins_network

networks:
jenkins_network:
3183 次点击
所在节点    程序员
15 条回复
icecreamxuegao
2019-12-10 10:28:09 +08:00
其他两个文件挂载正常,我在容器里面用 apk add docker 安装 docker 以后也能正常使用,有点不明白为什么 docker 挂载不上去
111qqz
2019-12-10 10:33:31 +08:00
hantsy
2019-12-10 10:38:37 +08:00
Docker 里面再跑 Docker,好像看了一些文章,不怎么推荐使用(有一些莫名的其妙的问题)。

Docker 里面的运行环境应该另外安装吧。
hantsy
2019-12-10 10:40:29 +08:00
一般挂载的包括:日志,数据,配置 等需要备份的东西。其他的我好像从来没有通过这种方式去实现 Host,Guest 共享。
icecreamxuegao
2019-12-10 10:42:38 +08:00
@hantsy 没有在 docker 里面跑 docker,我只是想用在 docker 里面用 docker 命令去编译镜像,然后再宿主机里面跑
sleven
2019-12-10 10:53:48 +08:00
你想用 Docker in Docker 模式( DinD )的话不是这么用的,起码不是简单把宿主机的 docker 文件挂载进容器就能用,你可以自己搞个基于 Jenkins 并在里面安装 Docker CE 的镜像。具体可以参考这篇文章: https://medium.com/swlh/quickstart-ci-with-jenkins-and-docker-in-docker-c3f7174ee9ff
Hopetree
2019-12-10 11:21:01 +08:00
我记得是权限问题,因为 Jenkins 容器的用户是 Jenkins,但是 docker 需要 root 用户以及有权限的用户,反正就是权限问题吧,网上挺多这方面的

其实我觉得没必要 Jenkins 运行 docker,搞个从节点,从节点有 docker 就行了,我一致都是主从节点搞的,主节点只运行 Jenkins 分配任务,从节点安装各种环境运行任务,从节点可以用容器运行任何,完美解决
zuihoudezhanyi
2019-12-10 14:15:33 +08:00
/root/jenkins/j-data 目录权限修改为 1000,应该可以了,我之前碰到过
zuihoudezhanyi
2019-12-10 14:17:05 +08:00
@zuihoudezhanyi 是用户和用户组
jackleeforce3615
2019-12-10 15:13:20 +08:00
我就是这样玩的,用 docker 的方式运行 jenkins,然后在 jenkins 中 slave 节点也是一些 docker,因此在 jenkins 中必须要能启动 docker 命令,比如 docker run ,docker inspect 等等。

我是参考这两篇文章:
https://www.cnblogs.com/leolztang/p/6934694.html
https://blog.container-solutions.com/running-docker-in-jenkins-in-docker

如果玩高级一点,docker 方式安装的 jenkins,构建中调用其他服务器(slave)上的 docker,参考:
https://jacklee.work/%E5%B7%A5%E4%BD%9C/2019-09-27-jenkins%20%E5%A3%B0%E6%98%8E%E5%BC%8Fpipeline%E8%B0%83%E7%94%A8%E8%BF%9C%E7%A8%8BDocker%E6%89%A7%E8%A1%8C%E4%BB%BB%E5%8A%A1.html

贴一下我的 docker-compose.yml 和 jenkins 的 dockerfile:

![docker-compose]( https://tva1.sinaimg.cn/large/006tNbRwgy1g9rmx1ilvqj30mj0h8wgk.jpg)

![dockerfile]( https://tva1.sinaimg.cn/large/006tNbRwgy1g9rmy4arfcj30ld08gt9u.jpg)
icecreamxuegao
2019-12-10 17:23:31 +08:00
好了,问题已经找到了,是因为 alpine 识别不了宿主机可执行文件的格式,换了另外一个镜像就可以了
icecreamxuegao
2019-12-10 17:31:31 +08:00
@jackleeforce3615 thx,我去看看。之前没用过 jenkins
icecreamxuegao
2019-12-10 17:32:37 +08:00
@zuihoudezhanyi 不是权限的问题,是 jenkins 我用了 alpine 版的镜像,宿主机是 centos 的,alpine 识别不了可执行文件
fatbear
2019-12-11 12:04:28 +08:00
@icecreamxuegao 并非是不识别可执行文件,是因为 apline 依赖的底层 C 库是 musl,而你在外面环境编译的 docker 大概率是基于 glibc 的, 库的名称不一致,导致没找到依赖库运行不了,尝试在 apline 镜像里运行 mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 建立 glibc 映射到 musl 的软链接在运行 docker 试试
fatbear
2019-12-11 12:12:49 +08:00
你在里面 apk add docker 可以正常运行自然也很好理解,你在里面安装 docker,在里面编译,自然不会出现不兼容的情况,但是宿主机是 centos,glibc 编译的程序在基于 musl 的 apline 上运行,就会碰到问题。楼主可以用 ldd 查看宿主机的 /usr/bin/docker,再进到容器里用 ldd 查看 apk add docker 之后的 /usr/bin/docker,就很容易明白为什么映射进去的运行不了

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

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

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

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

© 2021 V2EX