配置 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
. 然後我得到無法在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 伺服器實例