表达能力有限,起了一个奇怪的标题 QAQ~(望 V 友们海涵 QAQ~)
太啰嗦不看版:
** 用 docker 安装的 jenkins 怎样调用物理机上的 docker-compose
命令?**
啰嗦版:
有一台装了 docker
和 docker-compose
的 ubuntu 服务器(很奇怪,mac 和 windows 安装的 docker 自带 docker-compose, 服务器端 docker
安装完后,还需要单独安装 docker-compose
,通过apt install docker-compose
安装,物理机上通过 /usr/bin/docker-compose up -d
命令可启动)
下载 jenkins 镜像并启动,docker pull jenkinsci/blueocean
,
启动命令:
docker run -d --restart=always --name=my_jenkins -p 8089:8080 -p 50001:50000 -v /root/data/jenkins_home:/var/jenkins_home --user root --privileged -v /var/run/docker.sock:/var/run/docker.sock a1a26454c4cd
加上 --privileged -v /var/run/docker.sock:/var/run/docker.sock
参数是为了让身处容器内的 jenkins 能够调用物理机中的 docker 命令~
docker-compose
各种搜索发现大多是用 docker-compose 管理 jenkins 容器的回答,对于用 jenkins 容器调用 docker-compose 命令这种场景很少~可能我这种用 jenkins 容器启动 docker-compose 的思路不对~
转念一想,docker 既然已经提供 -v /var/run/docker.sock:/var/run/docker.sock
方式允许一个容器调用物理机的docker
命令,可能也会允许一个容器通过调用物理机的 docker-compose 命令来管理多个容器,难就难在找不到把物理机 docker-compose
命令映射到 jenkins 容器的路子~
感谢大佬们指点迷津!!!
1
Mystery0 2020-12-13 19:25:13 +08:00 via Android
docker-compose 不是要单独装吗,Jenkins 容器里面有装 docker-comppse ?
|
2
kozzzx 2020-12-13 19:34:05 +08:00 via iPhone
我的解决方法是把宿主机中安装的 docker-compose 也映射进 Jenkins 的容器中 `-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose`
|
3
easterfan OP @Mystery0 docker-compose 装在物理机里了,想让 jenkins 容器直接调用物理机的 docker-compose,话说 docker 容器里还可以装 docker-compose 呀~我真不知道 QAQ (也没搜索到)~
|
4
easterfan OP @kozzzx 感谢回复!
刚刚试了一下,物理机是 ubuntu 20,docker-compose 的安装路径是 `/usr/bin/docker-compose`,所以我用 `-v /usr/bin/docker-compose:/usr/local/bin/docker-compose` 做了映射,进入 jenkins 容器查看`/usr/local/bin/docker-compose`这个文件,是一个 python 脚本,但是因为 jenkins 容器里没有 python3 环境,执行到这一行的时候抛出了找不到 python3 的报错~ 我在想这样直接把 `docker-compose` 文件映射到容器内运行时是有问题的,还需要把物理机的 python3 环境也给映射过来~~ 但显然如果再把 python3 映射进来就背离了映射的初衷了~ 还是很感谢您的思路,如果您对这个问题感兴趣的话,希望能和您进一步交流! ![]( https://cdn.jsdelivr.net/gh/easterfan/picgo/blingbling/2020/20201213201623.png) |
5
Mystery0 2020-12-13 23:48:57 +08:00 via Android
@easterfan 我最开始用 docker-compose 跑 Jenkins 时候的做法是把宿主机作为一个 slave 运行,单独用来跑这种需要执行对运行的容器做操作的事情。其实我之前的意思是容器里面应该没有 docker-compose 这个运行文件,所以提示 not found
|
6
Mystery0 2020-12-13 23:49:46 +08:00 via Android
@easterfan 也不一定把 vi 的步骤也丢到宿主机,可以在 Jenkins 里面跑 ci,然后到 cd 的步骤的时候 ssh 到宿主机去执行脚本
|
8
Jirajine 2020-12-14 00:05:27 +08:00 via Android
映射 docker.sock 不是为了让容器调用宿主机的 docker 命令,而是为了让容器能直接访问跑在宿主机上的 docker daemon 服务。
而 docker-compose 是编排容器的,你可以理解为 docker-compose 命令、docker 命令、jenkins 是同类软件,都是和 docker daemon 服务交互的客户端。 所以正确的做法是把你的构建过程用 jenkins 的写法写出来,如果非要调用其他命令那就额外安装。 |
9
kozzzx 2020-12-14 02:21:48 +08:00
看了下服务器上 /usr/local/bin/docker-compose 是一个二进制文件。你可能是通过 pip 安装的,所以是个 Python 脚本。
我是根据官方教程中的这个步骤使用 curl 安装的( Install Compose on Linux systems ): https://docs.docker.com/compose/install/ |
10
swulling 2020-12-14 07:55:48 +08:00 via iPhone
映射 docker.sock 后容器里安装 docker-compose
|
11
dier 2020-12-14 09:47:59 +08:00
如果你最终调用 docker-compose 编排的容器是在宿主机上跑而不是在你那个 jenkins 容器里跑,那就把宿主机当做一台 slave 来用,通过 SSH 从 jenkins 中远程到宿主机,执行 docker-compose 来启动容器
|
12
dier 2020-12-14 09:50:03 +08:00
至于在容器里运行容器,这个操作,理论上是可行的,但肯定不是最合适的
|
13
passerbytiny 2020-12-14 10:04:16 +08:00 via Android
docker 是 C/S 架构,你得 docker 命令、docker-compose 、物理机,全部是客户端,docker 容器是运行在服务端的。
jenkins docker 方式,创建了两个容器,一个是作为服务端的 docker in docker,一个是作为客户端的 jenkins 自身。你物理机上的 docker-compose,跟 jenkins 是不同的客户端,当然是不能相互使用的。 |
14
Win78 2020-12-14 23:04:54 +08:00
看了描述,以前遇到过类似的问题,因为 docker 安装方式有问题。我是用云服务器直接生成一个自带 docker 的云服务器(如果支持的话)解决了这个问题。
手动用 apt install docker-compose,安装的 docker-compose 是个 python 文件,用楼上提供的命令 `-v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose` 映射后,进入到 jenkins 容器里运行 docker-compose 命令对比一下(理论上如果 docker-compose 命令调用成功,你的 jenkins 在执行到对应的脚本的时候应该是过的) 不过生产实践中,通常不会把 jenkins 放在容器里,我们通常直接将 jenkins 装在物理机中单独做一个 jenkins 服务器,jenkins 打包编译过程对一些大模块项目是非常吃服务器性能的,装在物理机中方便监测 CPU 和 硬盘读写 #PS 刚巧看到你买过我家的橙子,疫情艰难,渠道商压价严重,借楼给自家脐橙打个广告,望楼主海涵 |
15
julyclyde 2020-12-15 11:25:24 +08:00
本来好好的,你特地加一层,然后解决了其它做法不存在的问题
|