Docker push to AWS ECR не работает в Windows: нет базовых учетных данных

Я использую Docker в Windows (Docker для Windows, а не Docker Toolbox) и aws cli в оболочке cygwin ("git bash"). Я пытаюсь вставить образ докера в 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 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

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

В основном сводится к следующему:

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 в качестве переменных среды и повторение процесса. Безуспешно.

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

Осторожно, спойлеры

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


person Yonatan    schedule 10.07.2016    source источник


Ответы (5)


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

Однако мой собственный файл имел это содержимое после входа в систему любым из вышеперечисленных методов:

{
    "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

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

person Yonatan    schedule 10.07.2016
comment
Получил ту же проблему. Но это решение сработало отлично. Спасибо, что поделился! - person Oleksandr Tkalenko; 12.02.2019

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

,
"credsStore": "wincred"

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

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

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

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

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

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

person Dan    schedule 06.11.2016

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

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

Шаг 1. Получите свой токен аутентификации:

aws --profile default ecr get-authorization-token --region us-east-1 --output text --query authorizationData[].authorizationToken

(Примечание: если у вас есть профиль, измените имя по умолчанию на имя вашего профиля)

шаг 2: отредактируйте файл ~ / .docker / config.json

{
"auths": {
    "https://45456644454545.dkr.ecr.us-east-1.amazonaws.com": {
        "auth": "TRdfdhwe53hsdshhSdSHdsdssdsd...GGSDe="
    }
  }

}

Шаг 3: теперь вы можете отправить свой образ докера.

person Rudra Garnaik    schedule 19.03.2019