如何使用 docker CMD 指令和 运行 容器内的 AWS CLI 创建 DynamoDB table?

How to create DynamoDB table using docker CMD instruction and the AWS CLI inside running container?

你好,有一个简单的 Dockerfile,它必须创建 DynamoDB 表:

FROM amazon/aws-cli AS seed                                                                                                                            
                                                                                                                                                       
CMD \                                                                                                                                                  
aws dynamodb --endpoint-url http://localhost:8080 create-table \                                                                                       
    --table-name mytable \                                                                                                           
    --attribute-definitions AttributeName=user_id,AttributeType=N AttributeName=order_id,AttributeType=N \
    --key-schema AttributeName=user_id,KeyType=HASH AttributeName=order_id,KeyType=RANGE \                                                             
    --provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \                                                                                
    --region eu-west-2                                                                                                                                 

当我尝试 运行 它时,我得到以下输出:

Attaching to my-container
my-container       | 
my-container       | usage: aws [options] <command> <subcommand> [<subcommand> ...] [parameters]
my-container       | To see help text, you can run:
my-container       | 
my-container       |   aws help
my-container       |   aws <command> help
my-container       |   aws <command> <subcommand> help
my-container       | 
my-container       | aws: error: argument command: Invalid choice, valid choices are:
my-container       | 
my-container       | accessanalyzer                           | account                                 
my-container       | acm                                      | acm-pca                                 
my-container       | alexaforbusiness                         | amp                                     
my-container       | amplify                                  | amplifybackend                          
my-container       | amplifyuibuilder                         | apigateway                              
my-container       | apigatewaymanagementapi                  | apigatewayv2                            

// Lot of services in here
                       
my-container       | s3                                       | ddb                                     
my-container       | configure                                | deploy                                  
my-container       | configservice                            | opsworks-cm                             
my-container       | history                                  | cli-dev                                 
my-container       | help                                    
my-container       | 
my-container exited with code 252

我做错了什么?感谢您的帮助!

在你的命令中你必须之后没有space\这就是为什么你可能会收到错误,因为其余的语句被忽略了。

再次尝试测试:

aws dynamodb --endpoint-url http://localhost:8080 create-table \
--table-name mytable \
--attribute-definitions AttributeName=user_id,AttributeType=N AttributeName=order_id,AttributeType=N \
--key-schema AttributeName=user_id,KeyType=HASH AttributeName=order_id,KeyType=RANGE \
--provisioned-throughput ReadCapacityUnits=5,WriteCapacityUnits=5 \
--region eu-west-2

并且还尝试拥有一个虚假的配置文件,因为它需要一个访问密钥和一个秘密密钥,即使它是在本地

对于这个特定的图像,CMD 必须采用 JSON-array 语法(数组元素一个 shell 字)并且不得包含 aws 命令。

FROM amazon/aws-cli
CMD ["dynamodb", "create-table", "..."]                                                                                                                                                  

这是因为the aws-cli image declares ENTRYPOINT ["aws"], the ENTRYPOINT and CMD are combined into a single command, and string-format CMD inserts a shell wrapper。当前表单中的主要容器命令类似于 aws sh -c 'aws dynamodb ...',该工具并不真正理解它。

(我可能 运行 这个特定的命令作为一个独立的 docker run 命令,而不是尝试将它打包成一个图像,或者可能使用 AWS SDK 作为你的 integration-test设置代码。显式 localhost 端点似乎也可能无法正常工作,因为它通常指的是仅 运行 AWS CLI 的同一个容器。)