Содержание

Создание OCI образов с помощью kaniko

Настроил было сборку образов с помощью Docker в контейнере alpinelinux/docker-cli, но получил следующую ошибку:

ERROR: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Все операции осуществляются Docker-демоном, который принимает команды через сокет docker.sock. Получается нужно либо пробрасывать хостовый сокет в контейнер, либо использовать Docker-in-Docker. Последний вариант выглядит бессмысленным, т. к. запускать контейнеры нам не нужно, а требуется всего лишь создать образ и загрузить его в реестр. К тому же и этот вариант, возможно, потребует хостовый сокет.

Docker architecture

Архитектура Docker

Прокидывать же сокет в контейнер не стоит по соображениям безопасности — в этом случае контейнер должен работать в привилегированном режиме. Тогда в чём смысл изоляции?

Вкратце пройдёмся по альтернативам:

  • BuildKit: требуются костыли для запуска не в качестве демона.
  • Buildah: вариант от RedHat. Есть пакеты под разные дистрибутивы. Docker-образ выпущен 4 года назад.
  • kaniko: вариант от Google. Kubernetes native, пакеты будет сложно найти. С Docker-образами проблем нет.

Инструмент поставляется в двух версиях: обычная (gcr.io/kaniko-project/executor:latest) и отладочная (gcr.io/kaniko-project/executor:debug). В последней есть командная оболочка busybox, подходит для запуска в CI/CD пайплайнах.

В файл /kaniko/.docker/config.json нужно добавить параметры учётной записи:

shell

DOCKER_AUTH="$(echo -n $DOCKER_USR:$DOCKER_PWD | base64)"

echo \
"{
  \"auths\": {
    \"https://index.docker.io/v1/\": {
      \"auth\": \"$DOCKER_AUTH\"
    }
  }
}" > /kaniko/.docker/config.json

где

  • DOCKER_USR — переменная окружения с именем пользователя;
  • DOCKER_PWD — переменная окружения с паролем или токеном.

Для сборки образов используется исполняемый файл /kaniko/executor. Для сборки используем следующую команду:

shell-session

executor --context test-img --destination docker-usr/test-img:latest

где

  • test-img — название образа и директория, где находится Dockerfile и исходные файлы для сборки;
  • docker-usr — имя пользователя Docker Hub;
  • latest — версия образа;

Опция --dockerfile задаёт путь к Dockerfile, если он находится не в директории контекста или его имя отличатся от Dockerfile.

  1. Docker architecture
  2. Create Docker Images without Docker daemon (Kaniko)
  3. Docker Images Without Docker — A Practical Guide
  4. Use kaniko to build Docker images
  5. GoogleContainerTools / kaniko
  6. What is the difference between Kaniko and BuildKit/Buildx?
  7. Container Image Build Tools: Docker vs. Buildah vs. kaniko