← Назад к вопросам

Как забилдить Docker контейнеры в jobs

2.0 Middle🔥 231 комментариев
#CI/CD и автоматизация#Docker и контейнеризация

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Сборка Docker-контейнеров в GitLab CI/CD Jobs

В современных DevOps-практиках сборка Docker-контейнеров непосредственно в GitLab CI/CD jobs стала стандартом для автоматизации пайплайнов. Вот ключевые аспекты и лучшие практики этого процесса.

Базовый конфигурационный файл .gitlab-ci.yml

Для сборки Docker-образа в GitLab CI необходимо определить job с использованием Docker executor или shell executor с установленным Docker. Вот пример минимальной конфигурации:

stages:
  - build

build-container:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_TLS_CERTDIR: ""
    DOCKER_HOST: tcp://docker:2375
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker build -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA

Ключевые компоненты для сборки Docker в CI

1. Выбор базового образа runner

Использование официального образа docker:latest обеспечивает доступ ко всем инструментам Docker CLI.

2. Docker-in-Docker (DinD) сервис

Сервис docker:dind запускает Docker демон внутри контейнера, позволяя выполнять Docker команды.

3. Настройка переменных среды

  • DOCKER_TLS_CERTDIR: "" - отключает TLS для упрощения (не для продакшена)
  • DOCKER_HOST: tcp://docker:2375 - указывает на сервис DinD

Расширенные стратегии сборки

Кэширование слоев Docker

Для ускорения сборки можно кэшировать слои через volume или registry:

build-container:
  # ... предыдущие настройки ...
  script:
    - docker pull $CI_REGISTRY_IMAGE:latest || true
    - docker build 
      --cache-from $CI_REGISTRY_IMAGE:latest 
      -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA 
      -t $CI_REGISTRY_IMAGE:latest 
      .
    - docker push $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA
    - docker push $CI_REGISTRY_IMAGE:latest

Мульти-архитектурные сборки

Для поддержки разных архитектур (amd64, arm64):

build-multiarch:
  stage: build
  image: docker:latest
  services:
    - docker:dind
  before_script:
    - apk add --no-cache docker-buildx
    - docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
    - docker buildx create --use --name multiarch-builder
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
  script:
    - docker buildx build 
      --platform linux/amd64,linux/arm64 
      -t $CI_REGISTRY_IMAGE:$CI_COMMIT_SHORT_SHA 
      -t $CI_REGISTRY_IMAGE:latest 
      --push 
      .

Безопасность и оптимизация

Использование секретов

Никогда не хардкодите учетные данные:

variables:
  DOCKER_AUTH_CONFIG: $CI_DOCKER_AUTH_CONFIG

Оптимизация Dockerfile

Используйте многоступенчатые сборки и минимизируйте слои:

# Этап сборки
FROM golang:1.19-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o myapp .

# Финальный образ
FROM alpine:latest
COPY --from=builder /app/myapp /usr/local/bin/
CMD ["myapp"]

Параллельная сборка нескольких контейнеров

Для микросервисной архитектуры можно организовать параллельную сборку:

stages:
  - build

.build-template: &docker-build
  image: docker:latest
  services:
    - docker:dind
  variables:
    DOCKER_TLS_CERTDIR: ""
  before_script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY

build-service-a:
  <<: *docker-build
  stage: build
  script:
    - docker build -t $CI_REGISTRY/service-a:$CI_COMMIT_SHORT_SHA ./service-a
    - docker push $CI_REGISTRY/service-a:$CI_COMMIT_SHORT_SHA

build-service-b:
  <<: *docker-build
  stage: build
  script:
    - docker build -t $CI_REGISTRY/service-b:$CI_COMMIT_SHORT_SHA ./service-b
    - docker push $CI_REGISTRY/service-b:$CI_COMMIT_SHORT_SHA

Мониторинг и отладка

Для отладки проблем со сборкой добавьте проверки:

script:
  - docker version
  - docker info
  - docker build --no-cache --progress=plain -t test-image .

Интеграция с Container Registry

GitLab предоставляет встроенный registry, доступный через переменные:

  • CI_REGISTRY - адрес registry
  • CI_REGISTRY_IMAGE - путь к образу текущего проекта
  • CI_REGISTRY_USER, CI_REGISTRY_PASSWORD - учетные данные

Особенности для различных executor

  • Kubernetes executor: требует настройки volume mounts для Docker socket
  • Shell executor: требует предустановленного Docker на runner хосте
  • Docker executor: наиболее эффективен через DinD

Сборка Docker-контейнеров в GitLab CI jobs обеспечивает воспроизводимость, контроль версий и полную автоматизацию процесса доставки программного обеспечения, что является фундаментом современной DevOps культуры.

Как забилдить Docker контейнеры в jobs | PrepBro