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配置

Gitlab-Runner:从主服务器克隆的权限被拒绝

使用多个 docker 守护进程运行 gitlab-runner

gitlab-runner 的 executors 之 docker

docker环境下使用gitlab,gitlab-runner 为 NetCore 持续集成