[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-ci-cd-kak-jenkins-vzaimodeystvuet-s-docker":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":20,"progress":21,"seo":22},203,"kak-jenkins-vzaimodeystvuet-s-docker",6,"ci-cd","CI\u002FCD","🔄","Как Jenkins взаимодействует с Docker?","**Интеграция Jenkins с Docker** — это использование Docker-контейнеров в качестве изолированных сред для выполнения сборок, тестирования и упаковки приложений в рамках CI\u002FCD пайплайна.\n\n> Представьте, что Jenkins — это прораб на стройке, а Docker-контейнеры — это одноразовые рабочие помещения. Для каждого вида работ (покраска, электрика, сантехника) прораб заказывает отдельный контейнер-бытовку с нужными инструментами. После завершения работы бытовка утилизируется — на стройплощадке чисто, инструменты не путаются, краска не пачкает электрику.\n\n### 1. Docker как агент сборки\n\nКаждая сборка выполняется в чистом контейнере — изоляция, воспроизводимость, отсутствие конфликтов между проектами:\n\n```groovy\npipeline {\n    agent {\n        docker {\n            image 'maven:3.9-eclipse-temurin-17'\n            args '-v $HOME\u002F.m2:\u002Froot\u002F.m2 --network=host'\n        }\n    }\n    stages {\n        stage('Build') {\n            steps { sh 'mvn clean package' }\n        }\n    }\n}\n```\n\nКлючевой приём — монтирование кэша Maven (`-v $HOME\u002F.m2:\u002Froot\u002F.m2`), чтобы зависимости не скачивались заново при каждой сборке.\n\n### 2. Разные Docker-образы для разных стадий\n\nКаждая стадия пайплайна может использовать свой образ с нужным набором инструментов:\n\n\u003Cdetails>\n\u003Csummary>Пример: разные образы для сборки, тестов и публикации Docker-образа\u003C\u002Fsummary>\n\n```groovy\npipeline {\n    agent none\n    stages {\n        stage('Build') {\n            agent { docker { image 'maven:3.9-eclipse-temurin-17' } }\n            steps { sh 'mvn clean package -DskipTests' }\n        }\n        stage('Test') {\n            agent { docker { image 'maven:3.9-eclipse-temurin-17' } }\n            steps { sh 'mvn test' }\n        }\n        stage('Build Docker Image') {\n            agent { label 'docker' }\n            steps {\n                script {\n                    def app = docker.build(\"company\u002Fmy-app:${env.BUILD_NUMBER}\")\n                    docker.withRegistry('https:\u002F\u002Fnexus.company.com:8083', 'nexus-credentials') {\n                        app.push()\n                        app.push('latest')\n                    }\n                }\n            }\n        }\n    }\n}\n```\n\n\u003C\u002Fdetails>\n\n### 3. Docker Compose для интеграционных тестов\n\nКогда интеграционные тесты требуют внешних зависимостей (база данных, брокер сообщений, кэш), Docker Compose позволяет поднять всё окружение прямо на агенте:\n\n```groovy\nstage('Integration Tests') {\n    steps {\n        sh 'docker-compose -f docker-compose.test.yml up -d'\n        sh 'mvn verify -Pintegration-tests'\n    }\n    post {\n        always {\n            sh 'docker-compose -f docker-compose.test.yml down -v'\n        }\n    }\n}\n```\n\nБлок `post { always { ... } }` гарантирует остановку контейнеров даже при падении тестов.\n\n### 4. Dockerfile как агент\n\nЕсли ни один публичный образ не подходит, можно указать `Dockerfile` из репозитория проекта — Jenkins соберёт из него образ и запустит сборку внутри:\n\n```groovy\nagent {\n    dockerfile {\n        filename 'Dockerfile.build'\n        dir 'ci'\n        additionalBuildArgs '--build-arg MAVEN_VERSION=3.9'\n    }\n}\n```\n\n### Сравнение подходов к использованию Docker в Jenkins\n\n| Подход | Когда использовать | Преимущество |\n|---|---|---|\n| `docker { image '...' }` | Стандартные инструменты (Maven, Gradle, Node) | Простота, готовые образы |\n| `dockerfile { ... }` | Нужен специфичный набор инструментов | Полный контроль над окружением |\n| Docker Compose | Интеграционные тесты с зависимостями | Полное окружение для тестов |\n| `docker.build()` + `docker.push()` | Упаковка приложения в Docker-образ | Публикация образа в registry |\n\n### Вывод\n\nDocker в Jenkins решает проблему «на моей машине работает» и обеспечивает полную воспроизводимость сборок. Эфемерные контейнеры-агенты — это стандарт в современных CI\u002FCD пайплайнах.\n\n> **На собеседовании:** могут спросить, зачем монтировать `.m2` при использовании Docker-агента. Ответ: чтобы Maven не скачивал все зависимости при каждой сборке — кэш зависимостей сохраняется между запусками контейнера на хосте.","","middle",[15,16,8,17,18,19],"containerization","docker-agent","jenkins","docker-compose","docker",[],null,{"title":23,"description":24,"ogTitle":25,"ogDescription":26,"keywords":27,"schemaAnswer":36,"featuredSnippetReady":37},"Как Jenkins взаимодействует с Docker — Gymterview","Интеграция Jenkins и Docker: Docker как агент сборки, разные образы для стадий, Docker Compose для интеграционных тестов, Dockerfile как агент. Примеры Jenkinsfile.","Jenkins и Docker: 4 уровня интеграции с примерами — Gymterview","Docker как агент, разные образы для стадий, Docker Compose для тестов, Dockerfile как агент. Примеры Jenkinsfile для Java-проектов.",[28,29,30,31,32,33,34,35],"Jenkins Docker","Docker agent","Docker Pipeline plugin","docker.build","docker.withRegistry","Docker Compose Jenkins","контейнерная сборка","Java CI\u002FCD","Jenkins интегрируется с Docker на 4 уровнях: Docker как агент сборки (каждая сборка в чистом контейнере через agent { docker { image 'maven:3.9' } }), разные Docker-образы для разных стадий (agent none + agent per stage), Docker Compose для интеграционных тестов (docker-compose up\u002Fdown в pre\u002Fpost), Dockerfile как агент (сборка образа из Dockerfile в репозитории через agent { dockerfile {} }).",true]