配置 gitlab-ci.yml 以在 Gitlab CI 上的 docker 容器中运行 pytest

配置 gitlab-ci.yml 以在 Gitlab CI 上的 docker 容器中运行 pytest

我有一个使用 Docker 的 Cookiecutter django 项目。我使用 编写测试,pytest并使用 运行测试docker-compose -f local.yml run django pytest。我的local.yml文件位于我的根目录中(manage.py 所在的位置)

我想使用 Gitlab CI 自动运行这些测试。为此,我设置了自己的 gitlab 服务器,安装并配置了运行器。作为执行器,我使用 docker。

然后我尝试配置我的gitlab-ci.yml文件,但我不太确定如何正确配置。这是我目前所做的:

image: docker

services:
 - docker:dind

stages:
 - test

tests-website:
 stage: test
 before_script:
   - apk update
   - apk upgrade
   - apk add python python-dev py-pip build-base libffi-dev openssl-dev libgcc
   - pip install docker-compose
 script:
   - docker-compose -f local.yml build
   - docker-compose -f local.yml run django pytest

 tags:
   - docker

我的管道运行良好,直到docker-compose -f local.yml build。然后我得到

无法连接到 Docker 守护进程http://docker:2375- 它正在运行吗?如果它位于非标准位置,请使用 DOCKER_HOST 环境变量指定 URL。

我认为这是一个误导性的错误,因为我有点不明白如何执行 local.yml 文件。或者如何在管道中运行测试。也许我还需要进行更多配置才能运行测试?或者也许我到目前为止所做的完全是错误的?我不确定...

有人能帮我解决这个问题吗?非常感谢!提前谢谢!

答案1

存在两个潜在问题:

  • 首先,docker:dind 需要特权模式
  • 其次,自 19.03 版本起,docker:dind 默认仅监听 TLS 套接字(端口 2376)。
/ # netstat -ntpul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 :::2376                 :::*                    LISTEN      1/dockerd

因此,您可以选择使用 TLS 身份验证并以某种方式将证书传递到客户端容器内部,或者禁用 TLS,执行类似以下操作:

tests-website:
 stage: test
 variables:
  DOCKER_TLS_CERTDIR: ""
 before_script:
   - apk update
   - apk upgrade
...

然后它降级为普通 TCP(端口 2375)

/ # netstat -ntpul
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 :::2375                 :::*                    LISTEN      1/dockerd

让我感到好奇的是,如果你没有使用 kubernetes 或类似的东西来运行你的作业(我的意思是普通的 docker),那么为什么不直接使用 shell runner 并通过该机器上可用的 unix 套接字与 docker 对话呢?如果这不是一个选项,那么你可以使用挂载将机器的 docker 套接字传递到客户端容器内部,而不是启动 docker 服务器的附加实例

相关内容