我有一个使用 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 服务器的附加实例