Gitlab-Runner 向 docker 容器发出命令
Posted
技术标签:
【中文标题】Gitlab-Runner 向 docker 容器发出命令【英文标题】:Gitlab-Runner issue commands to docker containers 【发布时间】:2021-06-10 18:48:27 【问题描述】:我有以下 docker 网络配置(这是由我的 docker-compose.yml 文件生成的):
[
"Name": "docker-config_private",
"Id": "ed4e2db14df4930efeaa9174110bc1f72b754d727513ebfa1609c5d0c07ffabf",
"Created": "2021-03-11T17:26:36.392514302Z",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM":
"Driver": "default",
"Options": null,
"Config": [
"Subnet": "172.19.0.0/16",
"Gateway": "172.19.0.1"
]
,
"Internal": false,
"Attachable": true,
"Ingress": false,
"ConfigFrom":
"Network": ""
,
"ConfigOnly": false,
"Containers":
"3b72fd684b61e19f1fdcb688823ba5d0e2b3be48fdb335f3483b1e55d8f1781a":
"Name": "opensource-varnish",
"EndpointID": "76cd55be12f7ada945e91588a219bc029b8a592c6727ce67547c24be03bb047c",
"MacAddress": "02:42:ac:13:00:08",
"IPv4Address": "172.19.0.8/16",
"IPv6Address": ""
,
"3fbd1d890d567ef163b221c36b1e1a082af18a146c396f43cefa2fb4bb13dd02":
"Name": "db-backup",
"EndpointID": "2951e41b83bb2684aa49e1ec1e63d80c78ba8ac0f7189b6ccb5675145bff8ecf",
"MacAddress": "02:42:ac:13:00:03",
"IPv4Address": "172.19.0.3/16",
"IPv6Address": ""
,
"58f489d4540aea1ace7d07a9f3c3bafc5b7c4690b391e4f19818fb1bf791c300":
"Name": "opensource-redis",
"EndpointID": "251c4035c8fbb41b2034bd0485cdef1f9eb89ecc991f39a401d83d786b2333af",
"MacAddress": "02:42:ac:13:00:04",
"IPv4Address": "172.19.0.4/16",
"IPv6Address": ""
,
"6d5ce137c49c8f2138ee0888a889e7a5fad410b3dd592f9a076f45ea75050b15":
"Name": "opensource-db",
"EndpointID": "b034c8eab9781d1bb461f9593843d8d251bac4e046c1a830586bd3b702bfddb3",
"MacAddress": "02:42:ac:13:00:05",
"IPv4Address": "172.19.0.5/16",
"IPv6Address": ""
,
"707e3f229ab3015ec1db0a570faece043c5cce9a61a870730e4b198eb26cd067":
"Name": "gitlab-runner",
"EndpointID": "dc080c0cf4981a2d703602e4179601caec474503ee9ebf249b28ee9bab4c39c2",
"MacAddress": "02:42:ac:13:00:07",
"IPv4Address": "172.19.0.7/16",
"IPv6Address": ""
,
"70b68c92e966d208cf6210d9ade3fbbd12d46169f95682630eafb388573bcf17":
"Name": "gitlab",
"EndpointID": "e1822cac6fa0c130bb13d352174262e4657bdd87b7220c8d36f145cd6c2d8cd7",
"MacAddress": "02:42:ac:13:00:02",
"IPv4Address": "172.19.0.2/16",
"IPv6Address": ""
,
"728cf051d51682c753e8e27391a4678a4af64c4c53ea06c9758ea8a7f3367815":
"Name": "opensource-magento",
"EndpointID": "dca2b4ba83a793c550401ee5b1444f859c178d55c290784bed9f011af734e286",
"MacAddress": "02:42:ac:13:00:06",
"IPv4Address": "172.19.0.6/16",
"IPv6Address": ""
,
"7964fa137a537c2ba4132d2c8e9fc492586323560afffc4802a3e94fae33db68":
"Name": "opensource-cron",
"EndpointID": "db478da15938f5875e1b5b98040008870dc2227c2bd0ce1405cbbde9b7df4455",
"MacAddress": "02:42:ac:13:00:09",
"IPv4Address": "172.19.0.9/16",
"IPv6Address": ""
,
"Options": ,
"Labels":
"com.docker.compose.network": "private",
"com.docker.compose.project": "docker-config",
"com.docker.compose.version": "1.28.5"
]
如您所见,我有一个 gitlab-runner:alpine 实例与所有其他 docker 容器一起运行。
我需要的是在该实例中注册的跑步者部署一些代码,这是:
-
从远程 gitlab 拉取代码
在这些容器内发出命令(例如
docker exec ... bin/magento c:ci
)
重新启动 docker 容器
我有什么办法可以做到这一点吗?如果是这样,我需要什么执行器来运行我需要的命令?
我已经尝试使用本地 gitlab-runner 安装并使用 shell 执行器来发出命令,但是在 docker 容器中运行 gitlab 非常节省资源!
【问题讨论】:
【参考方案1】:使用 gitlab-runner 做某事的最好方法是在 gitlab-ci 中运行管道
你有 gitlab 的项目吗?设置管道。例如每次推送代码时都会触发
【讨论】:
我在 gitlab 中有一个项目,我配置了一个管道,但是该管道的运行器与所有其他 docker 容器在同一服务器中的一个 docker 容器内运行。【参考方案2】:树方式:
1。 安装 gitlab-runner 并配置为 shell runner 添加标签(例如 custom-docker)
你的 gitlab-ci.yml 脚本应该是这样的:
my-job:
tags:
- custom-docker
script:
- docker exec ... bin/magento c:ci
配置一个gitlab runner作为docker执行器,为docker服务挂载docker卷,就可以复制上面的job配置了
3。 使您可以通过 ssh 使用机器的 docker 主机(通过 ssh 搜索 docker),这样您的 runner 就可以部署在另一台机器上,并使用 docker 映像远程连接并运行与上述相同的操作
my-job:
image: docker
tags:
- custom-docker
before_script:
- add the SSH key
- ignore the known_host everification
- set DOCKER_HOST=ssh://user@server
script:
- docker exec ... bin/magento c:ci
【讨论】:
我似乎无法让 Shell Executor 工作,因为它在 gitlab-runner docker 容器内运行并且无法识别“docker exec”命令...【参考方案3】:你在 docker 中查看过 docker 吗?丁。 它是一个具有 docker 引擎的 runner exec,在 docker 容器内,您可以告诉它要运行哪个映像。每个 ci 步骤可以运行不同的图像。 如果你选择一个 docker 图像,你可以编写等。
我不认为在 ci 中使用 docker exec 是一个好主意,当 ci 结束时,运行器上下文将会消失。
如果您尝试运行在 ci 中生成的图像,请在 runner 之外启动它们。为此,我们使用了望塔,但还有其他方法。
【讨论】:
以上是关于Gitlab-Runner 向 docker 容器发出命令的主要内容,如果未能解决你的问题,请参考以下文章
2020.04.17以Docker形式安装gitlab和gitlab-runner
使用多个 docker 守护进程运行 gitlab-runner