[英]Unable to connect to docker container in Jenkins pipeline when using “Docker outside of Docker” setup
我正在基於這樣的代理運行 Jenkins 作業:
pipeline {
agent {
docker {
image 'cypress/base:10'
args '-v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -v /usr/local/bin/docker-compose:/usr/local/bin/docker-compose -u root'
}
}
…
注意: docker
和docker-compose
已安裝到我的代理容器中,以便能夠在管道階段內運行 docker 容器(“Docker 外部的 Docker”設置)
在管道中,我開始docker-compose
設置,它包含 2 個容器 - 服務器和 webapp
…
sh 'docker-compose up --build --detach'
…
之后,我想向localhost:8080
發送一個 GET 請求,這是應該從這里提供 Web 應用程序的地方。 但我明白了
Error: connect ECONNREFUSED localhost:8080
相同的 docker-compose 設置適用於我的開發人員。 機器。 端口轉發設置正確( docker-compose
配置文件中啟用了8080:8080端口轉發)
我認為這與我在 Jenkins 中所做的“Docker 之外的 Docker”設置有些相關,也許端口 8080 實際上似乎正在偵聽我的管道代理的主機,不確定......
我會很高興在這個問題上獲得新的想法,我完全沒有想到這個。
只是為了提供更多背景信息:我想通過 docker-compose 運行 web-app + API 服務器,然后運行 Cypress(在 docker-compose 設置之外)通過 UI 進行 E2E 測試
在 Jenkins docker docker 設置中,從技術上講,Z2E54334C0A5CE2E3E3E5A5845DF3AB3 與其他容器“共享”相同的空間。 這意味着,它可以與它“創建”的容器進行通信。
就我而言,我所做的是在我的 docker-compose.yml 文件上創建一個自定義橋接網絡
version: "3.8"
services:
app:
build:
context: .
ports:
- 8081:8080
depends_on:
- redisdb
networks:
- frontend
- backend
redisdb:
image: redis
ports:
- 127.0.0.1:6380:6379
networks:
- backend
networks:
frontend: {}
backend: {}
然后一旦創建,docker-compose 將使用以下格式創建這些網絡:
這些網絡通常是橋接網絡。
我的 Jenkins 容器最初位於默認網絡“網橋”中。 由於我的 jenkins 位於橋接網絡中,並且這些容器位於橋接類型網絡中,因此我可以稍后在管道中通過運行時連接我的 jenkins。
docker network connect pipeline_frontend jenkins
現在從 jenkins 開始,我可以通過容器的服務名稱直接與容器通信。 以我為例,從我的 Jenkins,我可以 curl 到 http://app:8080
注意:此答案僅適用於 Jenkins 容器與它創建的容器一樣僅駐留在主機中的情況。 我沒有在 Jenkins 具有外部節點的設置上對此進行測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.