Django

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

  • October 8, 2019

我有一個使用 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. 然後我得到

無法在http://docker:2375連接到 Docker 守護程序- 它正在執行嗎?如果它位於非標準位置,請使用 DOCKER_HOST 環境變數指定 URL。

我認為這是一個誤導性錯誤,因為我正在努力理解如何執行我的 local.yml 文件。或者我如何在管道中執行我的測試。也許我還需要做更多的配置才能讓測試執行?或者也許我到目前為止是完全錯誤的?我不確定…

有人可以幫我解決這個問題嗎?非常感謝您的幫助!提前非常感謝!

有兩個潛在的問題:

  • 首先, 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 伺服器實例

引用自:https://serverfault.com/questions/987188