Отправка образа докера в сценарии aws ecr и bash

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

aws ecr get-login --no-include-email --region us-west-2 | bash | docker push XXYYXXYYXXYY.dkr.ecr.us-west-2.amazonaws.com/test-sns-stack

Результат первой команды имеет следующий вид:

docker login -u AWS -p eyJwYXlsb2FkIjoicldnSWpITlpFZGhWQW1BdG1hcDB4SmYxYm9QbllTL0ZrVi9USWx0cTlnVUxtc1dpOVFVeW1MT2RLNy9tZmZCZ2l0SW9WRFBSRG1EWmxLYWozOGVwRXJqMy9TTW5oQUwxVWVBSHUrZFZCcEN0ZU1wTnVoVmdaa3BjQm14aWszTWRw....

Когда я вручную запускаю aws ecr login ..., docker login -u .... docker push ... У нас все хорошо.

Но при запуске однострочника он, очевидно, не может войти в систему. Мне кажется (!), Что он не ждет выполнения команды.

Баш не моя сильная сторона.


person Chanonry    schedule 16.08.2020    source источник


Ответы (2)


Документация предупреждает об использовании get-login:

Когда вы выполняете эту команду входа в докер, командная строка может быть видна другим пользователям вашей системы в списке процессов (ps -e). Поскольку команда docker login содержит учетные данные для аутентификации, существует риск того, что другие пользователи в вашей системе могут просматривать их таким образом. Они могут использовать учетные данные для получения доступа к вашим репозиториям. Если вы не в защищенной системе, вам следует использовать команду ecr get-login-password, как описано выше.

Лучше всего использовать get-login-password как в той же документации говорится:

aws ecr get-login-password --region region | docker login --username AWS --password-stdin aws_account_id.dkr.ecr.region.amazonaws.com

Теперь команда docker push, которую вы хотите выполнить, будет иметь смысл только в том случае, если вход в систему был успешным. Этого можно добиться с помощью оператора &&. Полная строка, используя ваш пример, будет:

aws ecr get-login-password --region us-west-2 | docker login --username AWS --password-stdin XXYYXXYYXXYY.dkr.ecr.us-west-2.amazonaws.com && docker push XXYYXXYYXXYY.dkr.ecr.us-west-2.amazonaws.com/test-sns-stack

Вы можете узнать больше об операторе && и других в этом ответе.

person Hernán Alarcón    schedule 17.08.2020
comment
И вы ответили на мой другой вопрос без моего разрешения! Отлично, спасибо. Предупреждение всегда меня беспокоило. - person Chanonry; 17.08.2020

Я думаю, что основная проблема здесь связана с предпосылкой bash |. Команды, передаваемые по конвейеру, фактически выполняются параллельно, что означает, что они запускаются в одно и то же время, но не обязательно заканчиваются в одно и то же время.

Замена последней трубы на && может решить вашу проблему:

aws ecr get-login --no-include-email --region us-west-2 | bash && docker push XXYYXXYYXXYY.dkr.ecr.us-west-2.amazonaws.com/test-sns-stack
person foo0x29a    schedule 17.08.2020
comment
Превосходно. Спасибо - person Chanonry; 17.08.2020