Как не хранить Docker-образы в GitLab CI

Практические лайфхаки для разработчиков, DevOps и админов: Docker, Linux, Bash, Python, Golang, Ansible, логи и безопасность — только рабочие решения. Даем готовые команды, конфиги и приёмы диагностики, которые экономят часы и дни. Если нужно быстро настроить, отладить и обезопасить инфраструктуру — вы по адресу.

dockergitlab cici/cd

ℹ️ В твоём GitLab CI/CD pipeline ты создаёшь Docker-образы для тестов или деплоя, но не хочешь тратить время и ресурсы на их постоянный пуш в registry (особенно, если они нужны только внутри одного pipeline).

➡️ Решение: используй встроенную функцию Docker-контекста для экспорта и импорта образов. Вместо того чтобы пушить образы, можно экспортировать их в .tar файл и передавать между этапами через кеш или артефакты.

🦊 Пример .gitlab-ci.yml:

stages:
  - build
  - test

build_image:
  stage: build
  script:
    - docker build -t my-app:latest .
    - docker save my-app:latest > my-app.tar
  artifacts:
    paths:
      - my-app.tar


test_image:
  stage: test
  script:
    - docker load < my-app.tar
    - docker run --rm my-app:latest pytest

🔥 Использование кеша для ускорения повторных запусков

Если образ создаётся одинаковым для одного и того же кода, можно использовать кеширование:

build_image:
  stage: build
  cache:
    key: "$CI_COMMIT_REF_SLUG"
    paths:
      - my-app.tar
  script:
    - if [ -f my-app.tar ]; then docker load < my-app.tar; fi
    - docker build -t my-app:latest .
    - docker save my-app:latest > my-app.tar

✳️ При повторном запуске для одного и того же коммита pipeline загрузит уже созданный образ из кеша.

tags: #полезно #docker #cicd

🧭 @recura_tech

Скриншот примера .gitlab-ci.yml с кодом: stages, job build_image и test_image, экспорт Docker-образа в my-app.tar и загрузка из него в следующем этапе.
Пример .gitlab-ci.yml: сохранение образа в my-app.tar и передача через артефакты/кеш.

Читайте так же