Всем привет ! Сегодня обсудим проблему, которая у меня возникла при выполнении интеграционных тестов с использованием test containers после миграции с docker на podman.
Caused by: com.github.dockerjava.api.exception.UnauthorizedException: Status 401: {"message":"unauthorized: The client does not have permission for manifest"}
А почему собственно podman ?
Тут все просто: организация, где я работаю, сделала свой выбор в пользу podman как инструмента контейнеризации и всем сотрудникам было предложено на него мигрировать.
Ты кто такой ?
Сам процесс миграции описывать не буду, он довольно тривиальный, да и на сайте podman все довольно подробно описано. Проблемы начались при выполнении интеграционных тестов. Тестовые контейнеры ни в какую не хотели скачиваться, ругаясь:
Caused by: com.github.dockerjava.api.exception.UnauthorizedException: Status 401: {"message":"unauthorized: The client does not have permission for manifest"}
Как говорится: "Ты кто такой ? Давай, досвидания!"
В чем же причина ?
Думаю пытливый читатель и сам понял, что при выполнении интеграционного теста podman не хватает логина и пароля для авторизации на ресурсе. Ну что же, будем решать!
Варинат номер раз.
Выполнить команду
podman login <путь к ресурсу>
Если вы родились под счастливой звездой и простой login решил все (ну хорошо, почти все) Ваши проблемы, то я жму Вам руку, а мы же простые смертные идем к следующему варианту.
Вариант номер два.
Принудительно скачать все образы, используемые в интеграционных тестах, на машину и уже затем запускать тесты.
podman pull <путь к образу>
Вариант номер три.
Ну и для тех зануд, кто любит когда все по уму сделано.
- Создаем (или вызываем на редактирование) файл
/Users/<имя пользователя>/.docker/config.json
- Задаем права доступа к ресурсу с образами тестового контейнера следующим образом
{
"auths": {
"resource.to.config.io": {
"auth": "<авторизационное значение>"
}
},
"credsStore": "secretservice",
"HttpHeaders": {
"User-Agent": "Docker-Client/19.03.5 (linux)"
},
"credHelpers": {
"resource.to.config.io": "ecr-login"
}
}
Здесь resource.to.config.io - это хост вашего ресурса
Авторизационное значение - это закодированное в base64 строка-пара
login:password
Закодировать строку в base 64 можно следующим образом
echo -n 'login:password' | base64
Ну в принципе и все. Пишите в комментариях насколько полезными, а главное рабочими оказались описанные выше варианты решения проблемы.