在我們的 Jenkins CI 中,我們并行運行我們的端到端集成測驗(使用 3 個 docker-compose 運行命令)。通過為每個呼叫分配單獨的專案名稱來進行分離,但這會導致所有容器都被重建(因為它們的專案名稱不同)。有沒有辦法避免這種情況?
所以我們真正需要的是:
- 構建在 docker-compose 檔案中定義的多個容器
- 多次運行容器集但完全分離 -無需重建且完全分離
我們基本上是這樣做的:
docker-compose build<- 這會在默認專案名稱下構建所有容器docker-compose run container command_1 -p project_1<- 這會重新構建所有容器,因為不存在專案名稱為“project_1”的容器。docker-compose run container command_2 -p project_2<- 因為這是并行完成的,所以它也會重建docker-compose run container command_3 -p project_3<- 因為這是并行完成的,所以它也會重建
這里基本上是我們的 docker-compose 檔案:
version: '3'
services:
db:
environment:
- POSTGRES_PASSWORD=foo
- POSTGRES_USER=foo
- POSTGRES_DB=foo_test
backend:
build:
context: ../backend
dockerfile: .docker/Dockerfile
command: /workspace/.docker/start_end2end.sh
depends_on:
- db
- redis
volumes:
- ./e2e.env:/.env
cypress:
ipc: host
build:
context: ../tests
dockerfile: Dockerfile
volumes:
- ../tests/cypress:/app/code/cypress
depends_on:
- backend
- frontend
environment:
- CYPRESS_baseUrl=http://frontend:4200
- CYPRESS_defaultCommandTimeout=10000
- CYPRESS_RETRIES=3
- NO_COLOR=1
frontend:
build:
context: ../frontend
dockerfile: .docker/Dockerfile
command: /workspace/.docker/start_end2end.sh
depends_on:
- backend
environment:
- BACKEND_HOST=backend
這是來自 Jenkinsfile 的相關部分:
stage('Building containers') {
steps {
sh "docker-compose -f ./shared/docker-compose.yml -f ./tests/docker-compose.override.yml build"
}
}
parallel {
stage('End2End Tests 1') {
steps {
sh "docker-compose -f ./shared/docker-compose.yml -f ./tests/docker-compose.override.yml -p ${env.JOB_NAME}_${env.BUILD_ID}_1 run --rm cypress npm run end2end:1"
}
}
stage('End2End Tests 2') {
steps {
sh "docker-compose -f ./shared/docker-compose.yml -f ./tests/docker-compose.override.yml -p ${env.JOB_NAME}_${env.BUILD_ID}_2 run --rm cypress npm run end2end:2"
}
}
stage('End2End Tests 3') {
steps {
sh "docker-compose -f ./shared/docker-compose.yml -f ./tests/docker-compose.override.yml -p ${env.JOB_NAME}_${env.BUILD_ID}_3 run --rm cypress npm run end2end:3"
}
}
}
我無法存檔我上面描述的內容,只有:
- 不要使用不同的專案名稱 -> 在多個并行呼叫上不重新構建。但是依賴的容器是共享的。
- 請使用不同的專案名稱 -> 在多個并行呼叫上重建。容器不共享。
uj5u.com熱心網友回復:
如該部分的docker compose 檔案參考中所述build
如果您指定
imageasbuild,則 Compose 使用webapp和 中tag指定的可選名稱來命名構建的影像image:build: ./dir image: webapp:tag
因此,無論當前專案名稱如何,以下內容將始終為所有具有相同名稱的服務構建影像,并在呼叫時默認使用這些影像(docker-compose up如果它們已經存在)。
services:
service1:
image: my_service1:1.0.0
build:
context: ../service1
dockerfile: .docker/Dockerfile
service2:
image: my_service2:1.0.0
build:
context: ../service2
dockerfile: Dockerfile
service3:
image: my_service3:1.0.0
build:
context: ../service3
dockerfile: path/to/another/Dockerfile
此示例稍后可以擴展到您自己的需要(例如,通過在環境檔案中傳遞標簽...)
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/406545.html
標籤:
