Создание 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-демоном, который принимает команды через сокет docker.sock. Получается нужно либо пробрасывать хостовый сокет в контейнер, либо использовать Docker-in-Docker. Последний вариант выглядит бессмысленным, т. к. запускать контейнеры нам не нужно, а требуется всего лишь создать образ и загрузить его в реестр. К тому же и этот вариант, возможно, потребует хостовый сокет.
Архитектура Docker
Прокидывать же сокет в контейнер не стоит по соображениям безопасности — в этом случае контейнер должен работать в привилегированном режиме. Тогда в чём смысл изоляции?
Альтернативы
Вкратце пройдёмся по альтернативам:
- BuildKit: требуются костыли для запуска не в качестве демона.
- Buildah: вариант от RedHat. Есть пакеты под разные дистрибутивы. Docker-образ выпущен 4 года назад.
- kaniko: вариант от Google. Kubernetes native, пакеты будет сложно найти. С Docker-образами проблем нет.
Использование kaniko
Инструмент поставляется в двух версиях: обычная (gcr.io/kaniko-project/executor:latest) и отладочная (gcr.io/kaniko-project/executor:debug). В последней есть командная оболочка busybox, подходит для запуска в CI/CD пайплайнах.
Аутентификация в Docker Hub
В файл /kaniko/.docker/config.json нужно добавить параметры учётной записи:
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. Для сборки используем следующую команду:
executor --context test-img --destination docker-usr/test-img:latest
где
test-img— название образа и директория, где находится Dockerfile и исходные файлы для сборки;docker-usr— имя пользователя Docker Hub;latest— версия образа;
Опция --dockerfile задаёт путь к Dockerfile, если он находится не в директории контекста или его имя отличатся от Dockerfile.
Список использованных материалов
- Docker architecture
- Create Docker Images without Docker daemon (Kaniko)
- Docker Images Without Docker — A Practical Guide
- Use kaniko to build Docker images
- GoogleContainerTools / kaniko
- What is the difference between Kaniko and BuildKit/Buildx?
- Container Image Build Tools: Docker vs. Buildah vs. kaniko