Docker能够运行针对AWS CLI的Shell命令

时间:2018-12-17 03:43:43

标签: docker aws-cli

我正在为使用Dockerfile访问密钥秘密进行参数化的Docker映像编写一个aws(我知道最佳实践是在运行时将任何和所有秘密作为环境变量进行传递,但是我只是在尝试,而不是构建我希望在生产中运行的东西。

但是,当我运行docker build时,构建过程意外失败。

我正在运行的命令是:

docker build -t foobar . --build-arg aws_access_key_id=SOMETHING --build-arg aws_secret_access_key=SOMETHING_ELSE

Dockerfile的主要部分是:

FROM python:3.6

# set the working directory
RUN ["mkdir", "app"]
WORKDIR "app"

# install environment dependencies
COPY "requirements.txt" .

# install code dependencies
RUN ["pip", "install", "-r", "requirements.txt"]

# provision
ARG aws_access_key_id
ARG aws_secret_access_key
RUN ["sh", "-c", "\"aws configure set aws_access_key_id $aws_access_key_id\""]
RUN ["sh", "-c", "\"aws configure set aws_secret_access_key $aws_secret_access_key\""]

我收到的错误消息是:

sh: 1: aws configure set aws_access_key_id ******************MQ: not found
The command 'sh -c "aws configure set aws_access_key_id $aws_access_key_id"' returned a non-zero code: 127

基本上sh表示它在构建时不知道任何aws命令。但是,我清楚地表明awsclirequirements.txt中的一个依赖项,它是较早安装的(为了完整性起见,在此提供;这是一个单行文件):

awscli

这些sh命令在我的本地计算机上运行。当我将最后两个sh命令从图像中注释掉,构建图像,通过docker exec -it <pid> /bin/bash插入外壳并在那里执行它们时,它们也起作用。

因此,我的问题是:为什么这些命令在构建时失败?

1 个答案:

答案 0 :(得分:1)

将运行命令更改为以下内容:

RUN aws configure set aws_access_key_id $aws_access_key_id
RUN aws configure set aws_secret_access_key $aws_secret_access_key

原因:

以这种方式将“ aws configure set aws_access_key_id $aws_access_key_id”作为实际命令,而不是“ aws”作为命令。

基本上,您要添加双引号并得出以下结果:

$ sh -c "\"echo foo\""
sh: echo foo: command not found

您可以在示例中删除转义的引号,它将起作用。