Докер толчок к AWS ККМ не на Windows: нет основные учетные данные для проверки подлинности


Я использую docker в windows (Docker для Windows, а не Docker Toolbox) и aws cli в оболочке cygwin ("git bash"). Я пытаюсь протолкнуть образ docker в AWS ECR-частный репозиторий ECS.

Что бы я ни делал-когда я бегу docker push я постоянно получаю:

no basic auth credentials

Метод 1

Я следовал инструкциям и выполнял стандартные команды:

$ $(aws --profile myprofile ecr get-login --region us-east-1)
Login Succeeded
$ docker tag myrepo:latest 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
$ docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
The push refers to a repository [232097583865.dkr.ecr.us-east-1.amazonaws.com/potion]
688f61a6956d: Preparing
11908ead416e: Preparing
no basic auth credentials

Безрезультатно.

Попытка вытащить показывает, что действительно, у меня нет доступ:

$ docker pull 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo
Using default tag: latest
Pulling repository 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo
unauthorized: authentication required

Однако docker действительно думает, что я вошел в систему:

$ docker logout https://123456789.dkr.ecr.us-east-1.amazonaws.com
Remove login credentials for https://123456789.dkr.ecr.us-east-1.amazonaws.com

# let's run again - should not be logged in now
$ docker logout https://123456789.dkr.ecr.us-east-1.amazonaws.com
Not logged in to https://123456789.dkr.ecr.us-east-1.amazonaws.com

Хм.

Метод 2

Internet предлагает разделить команду и использовать более старую процедуру для входа в систему.

В основном сводится к чему-то вроде этого:

docker login -u AWS -p $(aws --profile myprofile ecr get-authorization-token --region us-east-1 --output text --query authorizationData[].authorizationToken | python -c 'import base64, sys; print base64.b64decode(sys.stdin.read())' | cut -d: -f2) https://123456789.dkr.ecr.us-east-1.amazonaws.com

Это также кажется успешным, но docker push или pull приводят к тому же провалу.

Другие Тупики

Windows и cygwin-это странно. Итак, давайте поместим команду docker login в сценарий оболочки файл, и запустить его, или источник его. Никакой успех.

Создание дополнительных профилей AMI с явными маркерами доступа и новыми наборами учетных данных. Никакой успех.

Экспорт учетных данных AWS в качестве переменных среды и повторение процесса. Никакой успех.

Использование awesome aws-temp-token.sh скрипт, который принимает код MFA и генерирует учетные данные сеанса в качестве переменных среды. Без успеха (хотя инструмент спасает жизнь в другое время, так что используйте он).

Предупреждение О Спойлере

В конце концов мне удалось решить эту проблему. Это было так неприятно, хотя и я не нашел в интернете упоминания о решении, так что написание ответа, надеюсь, облегчит часть душевной боли.
4 9

4 ответа:

Один из моих поисков привел меня к этому ответу, который, хотя и не имеет отношения к моему делу, привлек мое внимание к месту, где хранятся учетные данные аутентификации: файл docker config.json. Посмотрите здесь , Чтобы прочитать больше о нем и его использовании auth.

Тем не менее, мой собственный файл имел это содержимое после входа в систему с помощью любого из методов выше:

{
    "auths": {
        "https://123456789.dkr.ecr.us-east-1.amazonaws.com": {}
    },
    "credsStore": "wincred"
}

Явное упоминание Windows (wincred) привлекло мое внимание. Читать больше в этом, похоже, настройки в Windows использует вспомогательное хранилище учетных данных , которое, вероятно, лучше, чем хранение учетных данных в виде обычного текста в файловой системе (обычно он хранится как base64, что по-гречески означает "обычный текст").

Однако-решение пришло, когда я вручную отредактировал этот файл, чтобы непосредственно содержать маркер аутентификации.

Я сгенерировал свой токен аутентификации с помощью этой команды (выходные данные сокращены для краткости):

$ aws --profile myprofile ecr get-authorization-token --region us-east-1 --output text --query authorizationData[].authorizationToken
jFHNnVxZ............Vqc==

После редактирования ~/.docker/config.json, это выглядело примерно так это:

{
    "auths": {
        "https://123456789.dkr.ecr.us-east-1.amazonaws.com": {
            "auth": "jFHNnVxZ............Vqc=="
        }
    }
}

И с этим на месте, толчок, наконец, успешен:

$ docker push 123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo:latest
The push refers to a repository [123456789.dkr.ecr.us-east-1.amazonaws.com/myrepo]
61a69688f56d: Pushed
11ad4908e16e: Pushed
myrepo: digest: sha256:20c0f3......82aa19 size: 42162

И снова все хорошо.

Продолжая свой собственный блестящий ответ, который вытащил меня из тюрьмы. Я обнаружил, что если удалить:

,
"credsStore": "wincred"

Сохраните файл, выполните команду docker login еще раз, она поместит учетные данные непосредственно в config.json, который я нашел, чтобы работать.

Оставив что-то вроде

{
    "auths": {
        "https://407163548648.dkr.ecr.eu-west-1.amazonaws.com": {
            "auth": "QV...Nbz0=",
            "email": "AWS"
        }
    }
}

Добавляя больше к вышесказанному, это, вероятно, заслуживает вопроса, поднятого с Docker для совместимости AWS и проблемы с AWS для документации. Docker делает правильную вещь в этом случае, используя хранилище учетных данных Windows, однако AWS пытается перегрузить базовую проверку подлинности с помощью проверки подлинности сертификатов.

В частности, запуск docker login фактическиделает добавление записи в хранилище учетных данных Windows. Вы можете увидеть это, открыв Диспетчер учетных данных, выберите "Учетные данные Windows", и вы увидите новая запись для введенного вами URL-адреса https://12345678.dkr.ecs.region.amazonaws.com.

Проблема в том, что AWS использует открытый ключ в качестве пароля, а Windows не позволяет вводить пароль так долго. Вы можете попробовать это, скопировав пароль из AWS, отредактировав сохраненные учетные данные и попытавшись вставить значение. Окна тебе не позволят.

Попробуйте это:

eval $(aws ecr get-login --no-include-email | sed 's|https://||')