将Docker映像推送到AWS ECR和Bash脚本

问题描述

我正在尝试将图像推送到awr 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 ...我们很好。

但是运行一个线性班轮显然无法登录。对我来说(!)好像没有等待命令执行一样。

不是我的强项。

解决方法

我认为这里的主要问题是围绕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
,

The documentation警告使用get-login

执行此docker login命令时,该命令字符串在进程列表(ps -e)显示中对系统上的其他用户可见。由于docker login命令包含身份验证凭据,因此存在系统上其他用户可能以这种方式查看它们的风险。他们可以使用凭据来获得对您存储库的推送和拉取访问权限。如果您使用的不是安全系统,则应使用如上所述的ecr get-login-password命令。

最佳做法是使用the same documentation所说的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

您可以在this answer中进一步了解&&运算符和其他运算符。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...