NSArray *assorted = [@"1 2 3 9 ; : 구 , 결 A B C Z ! á" componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSArray *sorted = [assorted sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
/* NSOrderedAscending, NSOrderedSame, NSOrderedDescending */
BOOL isPunct1 = [[NSCharacterSet punctuationCharacterSet] characterIsMember:[(NSString*)obj1 characterAtIndex:0]];
BOOL isPunct2 = [[NSCharacterSet punctuationCharacterSet] characterIsMember:[(NSString*)obj2 characterAtIndex:0]];
if (isPunct1 && !isPunct2) {
return NSOrderedAscending;
} else if (!isPunct1 && isPunct2) {
return NSOrderedDescending;
}
return [(NSString*)obj1 compare:obj2 options:NSDiacriticInsensitiveSearch|NSCaseInsensitiveSearch|NSNumericSearch]|;
}];
Мне повезло, используя eval. Например,
$ aws ecr get-login --region us-east-1 --no-include-email --profile username_env
не работает.
$ eval $(aws ecr get-login --region us-east-1 --no-include-email --profile username_env)
Работал.
Ни одно из приведенных выше решений не сработало для меня, но я обнаружил, что когда я установил регион в команде ecr login, это сработало.
aws ecr get-login --region us-west-2
Проблема заключается в том, что команда aws ecr get-login извлекает токен, действительный для указанного реестра в течение 12 часов, а затем печатает команду входа в Docker с этим токеном авторизации, и мы не выполняем полученную нами команду назад.
Нам нужно выполнить эту напечатанную команду, чтобы войти в ваш реестр с помощью Docker. В моем случае я использую eval для выполнения напечатанной команды, которую я получаю из aws ecr get-login, например:
eval $ (aws ecr get-login --region eu-west-1 - -профиль)
Это произошло, когда я пытался вытолкнуть / извлечь данные из реестра в другой учетной записи AWS. Мне нужно было запустить get-login
с флагом --registry-ids
, передав идентификатор реестра, в который я хотел войти.
В моем случае проблема заключалась в нескольких учетных данных в ~ / .aws / учетные данные. Я использую --profile
aws ecr get-login --no-include-email --region us-east-2 --profile xxxx
Это сработало для меня.
Предупреждение: aws ecr get-login
не отображается для подключения к серверам AWS и работает, даже если у вас плохой доступ к секретным ключам AWS или даже если вы забыли ввести свои секретные ключи доступа AWS в качестве переменных среды.
Он по-прежнему с радостью предоставит вам длинный пароль без ошибки. Таким образом, сообщение, полученное от AWS, является ошибкой истечения срока действия вместо более правильной и полезной «неверной авторизации».
Примечание. Использование версии 1.11.112 aws-cli.
Только что возникла такая же проблема в Linux Mint 18.1 (Ubuntu 16.04) с AWS ECR и последней версией Docker 17.06.1-ce, используемой в последнем клиенте Python Docker 2.5.1. Вход в систему сработал, нажать не удалось.
Удаление ~/.docker/config.json
помогло. Он содержал только, вероятно, устаревший токен авторизации.
Я не думаю, что это как-то связано с операционной системой. В моем случае это работало ранее, и единственное изменение, которое я могу вспомнить, - это обновление с репо Ubuntu docker.io 1.12
до репо Docker docker-ce 17.06
.
Вам необходимо обновлять свой токен авторизации каждые 12 часов, попробуйте:
$(aws ecr get-login --no-include-email --region us-east-1)
- изменить регион в соответствии с вашей конфигурацией
Возможно, вы просто запускаете команду и не вставляете команду, которая выводится из этой команды, обратно в терминал. Легкая ошибка, чтобы сделать. Как только вы запустите:
aws ecr get-login --no-include-email --region us-east-1
Он напечатает другую команду для запуска, вам нужно будет скопировать эту команду и запустить ее в своем терминале для полной аутентификации.
Или крутой способ - просто передать команду echo'd обратно в оболочку с помощью:
aws ecr get-login --no-include-email --region us-east-1 | sh
Последние версии Docker используют новую функцию хранения учетных данных, в которой есть ошибка , при которой выполнение docker login
с URL-адресом, который указывает протокол, приведет к ошибкам истечения срока действия токена. Эта проблема будет исправлена в Docker 1.13.
В настоящее время обходной путь заключается в выполнении ваших команд входа в систему без указания протокола.
Таким образом, в блоке команд, возвращаемом aws ecr get-login
:
docker login -u AWS -p AQECAHh....b6Wk -e none https://1234567890.dkr.ecr.eu-west-1.amazonaws.com
Должен быть заменен следующим:
docker login -u AWS -p AQECAHh....b6Wk -e none 1234567890.dkr.ecr.eu-west-1.amazonaws.com
Пропуск https://
должен заставить докер работать на время будучи.
Я знаю, что сообщение связано с MacOS Sierra, но для тех, у кого проблема в Windows, я выполнил следующее:
1) aws ecr get-login, эта команда выведет длинную строку
вход в докер -u AWS -p eyJwYXlsb2FkIjoiUXBnQ2FTV1B6Q1JqZGlH ..... . (пропущена вся строка для лучшего понимания) -e нет https: // xxxxxxx.dkr.ecr.us-east-1.amazonaws.com .
2) Скопируйте и вставьте вышеприведенную строку (возможно, -e ничего не получится, поэтому удалите ее тоже) . Вывод будет отображать предупреждение с последующим успехом: ВНИМАНИЕ! Использование --password через CLI небезопасно. Используйте --password-stdin. Вход выполнен успешно
Если вам нужен безопасный способ, используйте --password-stdin
3) Теперь вы можете безопасно нажать image -docker push xxxxxxx.dkr.ecr.us-east-1.amazonaws.com/ecfs-test
0429f33dd264: Pushed
48accfb13167: Pushed
f3bb6dd29c05: Pushed
e58ae65fa4eb: Pushed
3c6037fae296: Pushed
3efd1f7c01f6: Pushed
73b4683e66e8: Pushed
ee60293db08f: Pushed
9dc188d975fd: Pushed
58bcc73dcf40: Pushed
latest: digest: sha256:4354d137733c98a1bc8609d2d2f8e97316373904e size: 2404
Может быть, это решение будет работать и на Mac.
Я использовал стабильную версию Docker для Mac Version 1.12
Я только что обновился до бета-версии Version 1.13.0-rc4-beta34.1 (14853)
, и теперь все работает как задумано.
Поэтому, если есть люди с такой же проблемой, убедитесь, что вы используете Docker для Mac версии 1.13 или выше, если 1.13 еще не выпущен, переключитесь на бета-версию.
Вы также получаете сообщение «Срок действия вашего токена авторизации истек», если у вас есть несколько учетных данных в ~ / .aws / credentials (путь зависит от вашей ОС), и вы забыли добавить флаг --p.
Используйте эту команду для получения логина:
aws ecr get-login --region eu-west-1 --p <yourprofilename>
Я также получал ту же ошибку, ниже приведено решение, которое я пробовал, и оно работает: 1. Запустите команду: aws ecr get-login --no-include-email --region ap-southeast-1 (изменить регион в соответствии с вашим хранилищем) 2. вы получите что-то вроде: вход в докер -u AWS -p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx == https://youraccountid.dkr.ecr.ap-southeast-1.amazonaws.com
Удалите «https: //», а затем выполните команду от имени входа в докер -u AWS -p xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx == youraccountid.dkr.ecr.ap-southeast-1.amazonaws.com
И это сработает, и вы сможете нажать на изображение.